文档章节

Java 二进制I/O流之字节流

YH_猿员猿
 YH_猿员猿
发布于 2016/07/21 17:32
字数 945
阅读 12
收藏 0
点赞 0
评论 0

引入:

    文件可以分为你两种类型进行存储,一是以文本的格式存储,其他的都是以二进制的方式进行存储的,比如:(100100001111).
    在文本的读取中,我们有Scanner和PrintWriter方法中文本中读入和写出数据。

读取文本数据:
Scanner input= new Scanner(new File(“text.txt”));
System.out.println(input.nextLine());
写入文本数据:
PrintWriter output = new PrintWriter(“text.txt”);
output.print(“Java Test”);

二进制I/O:

1.简介

其实对于计算机来说,存储的只有二进制数,因为计算机只能识别 0 和 1 ,文本主要在于在二进制的基础上加上了编码和解码的过程。由于二进制不需要编码解码,所以比文本要高效。

2.二进制I/O类
主要分为输入类和输出类两部分:这里写图片描述
其实输入和输出流都是很像的,而且方法的用法也差不多,下面我们用几个列子来详细介绍这些类的使用:

3.输入输出实现

简单的输入输出实现,这里先实例化一个输出流,向文件中写入了十个二进制的值,利用write()方法,当你查看文件时会发现是乱码。然后在实例化输入流,利用其read()方法,从文件中读取出二进制值。在处理完成时要记得关闭流。这里会有异常,我们直接在方法上抛出了。

public static void main(String[] args) throws IOException{
        //文件保存位置
        File file = new File("D://test.txt");

        //输出流,写入数据
        FileOutputStream outputStream = new FileOutputStream(file);
        for (int i = 0; i < 10; i++) {
            outputStream.write(i);
        }
        //输入类,读取数据
        FileInputStream input = new FileInputStream(file);
        int len;
        while((len = input.read()) != -1){
            System.out.println(len+"");
        }
        outputStream.close();
        input.close();

    }

文件复制功能
利用I/O流进行文件的复制

public static void main(String[] args) {
        try {
            FileInputStream fis = new FileInputStream(new File("D://music.mp3"));
            FileOutputStream fos = new FileOutputStream(new File("D://copy.mp3"));

// //从输入流中读取一个字节,就放在输出流中输出,效率太慢
// int len = 0;
// while((len = fis.read()) != -1){
// fos.write(len);
// }


            int len = 0;
            byte[] buff = new byte[512];        //自定义缓冲区
            while((len = fis.read(buff)) != -1){
                fos.write(buff,0,len);          //将缓冲区写到文件,而不是一个字节一个字节的写入
            }
    // fos.flush(); //清空 缓冲区,但不会关闭流
            fos.close();  //具有flush()和close两个功能
            fis.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

这里有两种方法,一种是直接进行读取和写入,一个字节一个字节的去执行,直到数据全部复制完成。另一种是我们自定义一个byte数组,来暂存一些从I/O流中读取的数据,然后再将数组中的全部数据以输出流写入到文件中,当我们执行的时候会发现这种效率是非常高的,这就用到了缓冲机制。我们自定义了一个缓冲区,及大小。


然而javaAPI中也给我们提供了自己的I/O缓冲方式。就是BufferedInputStream和BufferedOutputStream让我们去使用。

public static void main(String[] args) {
        //
        FileInputStream fis = null;
        FileOutputStream fos = null;
        BufferedInputStream buffInput = null;
        BufferedOutputStream buffOutput = null;
        try {
            fis = new FileInputStream(new File("D://music.mp3"));
            fos = new FileOutputStream(new File("D://copy.mp3"));

            //利用缓冲
            buffInput = new BufferedInputStream(fis);
            buffOutput = new BufferedOutputStream(fos);

            int numberCopy = 0;
            int len = 0;
            while((len = buffInput.read()) != -1){
                buffOutput.write(len);
                numberCopy++;
            }

            //关闭流
            buffOutput.close();
            buffInput.close();

            System.out.println(numberCopy+"bytes");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

我们一般都可以使用自定义一个数组,用于缓冲区,进行缓冲机制的实现,因为使用系统自带的需要另外常见两个buffer缓冲区。可能会带来内存上的过多占用。

总结:

  1. I/O流的处理上一定要记得捕获异常,并对其处理。
  2. 使用完流后一定要记得关闭流通道。
  3. 在大文件的处理上要加入缓冲机制。

本文转载自:http://blog.csdn.net/yin569258/article/details/50912803

共有 人打赏支持
YH_猿员猿
粉丝 0
博文 12
码字总数 0
作品 0
徐汇
程序员
Java: I/O(1/3)字节流与字符流的纵向与横向比较

Summary 总述 java.io包中的类非常繁多,但其实只要归成4类: & 、 & ,由于功能和命名上都相当接近,因此只要掌握了其中一种,将会很容易理解其他3种。 横向归类: & (字节流)、 & (字符...

大鱼BIG_FISH
2015/11/16
0
2
JavaIO/输出输入入门

IO称之为输入输出,Java的IO是通过java.io包下的类和接口来支持,包含两大类:输入,输出. 在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Write...

Zhao-Qian
2013/01/04
0
0
关于Java编程基础学习输入输出IO的问题

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
05/23
0
0
java编程学习:文件流操作!

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
06/04
0
0
java和C#里byte的取值范围

java里一个byte取值范围是-128~127, 而C#里一个byte是0~255. 首位不同. 但是底层I/O存储的数据是一样的, 比如, 十进制的100, 转换成java或者c#的byte, 都是1100110. 但是, 使用java的getByte...

喔喔兒
2011/03/30
0
0
Mysql latin1也支持emoji字符的错觉分析

起初发现了如下的现象: mysql> show variables like 'character%';+--------------------------+---------------------------------------+| Variable_name | Value |+---------------------......

zgw06629
2015/05/13
0
0
java InputStream 文件读写 网络UDP/TCP

java io流 传输操作 字节流和字符流的区别: 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,字符流就是 : 字节流+编码表。 处理对象不同:字节流能处理所有类型的数据(如...

cicue
2014/09/15
0
0
【深入理解java虚拟机】类加载机制

类加载过程 类从被加载到虚拟机内存中开始,到卸载为止,整个生命周期为:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使...

Gillben
05/30
0
0
java serializable深入了解

一、串行化(序列化)的概念和目的 1. 什么是Serialization? 串行化(Serialization)是计算机科学中的一个概念,它是指将对象存储到介质(如文件、内在缓冲区等)中或是以二进制方式通过网络传...

亚特兰缇斯
2015/03/04
0
0
Java序列化(Serializable)与反序列化

简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供...

陶邦仁
2015/04/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!

前言 Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据。 本篇主要想讨论 ConcurrentHashMap 这样一个并发容器,在正式开始之前我觉得有必要谈谈 HashMap,没有它...

crossoverJie
9分钟前
2
0
OSChina 周一乱弹 —— 你的朋友圈有点生锈了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @Devoes :分享Trademark的单曲《Only Love (电视剧《妙手仁心 II》插曲)》: 《Only Love (电视剧《妙手仁心 II》插曲)》- Trademark 手机党少...

小小编辑
今天
249
9
【面试题】盲人坐飞机

有100位乘客乘坐飞机,其中有一位是盲人,每位乘客都按自己的座位号就坐。由于盲人看不见自己的座位号,所以他可能会坐错位置,而自己的座位被占的乘客会随便找个座位就坐。问所有乘客都坐对...

garkey
今天
1
0
谈谈神秘的ES6——(二)ES6的变量

谈谈神秘的ES6——(二)ES6的变量 我们在《零基础入门JavaScript》的时候就说过,在ES5里,变量是有弊端的,我们先来回顾一下。 首先,在ES5中,我们所有的变量都是通过关键字var来定义的。...

JandenMa
今天
2
0
arts-week1

Algorithm 594. Longest Harmonious Subsequence - LeetCode 274. H-Index - LeetCode 219. Contains Duplicate II - LeetCode 217. Contains Duplicate - LeetCode 438. Find All Anagrams ......

yysue
今天
2
0
NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
今天
1
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
1
0
AB 压力测试

Ubuntu 安装AB apapt-get install apache2-utils 使用AB 压力测试 -c 并发数 -n请求总数 ab -c 3000 -n 10000 http://localhost/test/index.php AB只能测试localhost 返回结果 This is Apac......

xiawet
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
1
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部