八位流:

在计算机中存储的最小单位是位(binary),也就是01的二进制码,但是非特殊情况下,能操作的最小存储单位是字节,每8位一个字节。在计算机中所有的文件都是以字节组成,所以八位流也叫做字节流、通用流,通过八位流可以操作所有的文件。

所以八位流输出和输入的最小单位就是字节,流是在文件和程序中建立一个数据传输通道,通过这个通道可以把程序的数据传输文件上,或把文件的数据传输到程序上。

八位流的祖先类:InputStream输入流和OutputStream输出流,它们都是抽象类,不能够直接构建对象。

InputStream的实现类是FileInputStreamOutputStream的实现类是FileOutputStream

 

 

FileInputStream文件输入流里的主要方法:

read();

这是单个字节读取的read方法,每次只读取一个字节,此方法会返回一个int类型的值,来表示每次的读取的数据,如果返回的值是-1就代表已经将数据读完了,不是-1就是代表读取的数据。

 

代码示例:

81276025c1c71678c5ab6437ecf6139e.png


运行结果:

e4ab3c14b7ad343e1f5a29bafe2031be.png




read(byte[]);

这是批量读取的read方法,此方法需要传递一个byte数组来表示每次要读取的长度,也就是说你传递过去的byte数组有多长,每次就读取多长的字节。读取后会把读取的数据存放到这个byte数组里,如果这个文件的里的数据没有传递过去的数组长度这么长就只读取文件数据的长度,此方法也是int类型的返回值,代表每次读取的长度,返回-1则是代表文件已读完。

 

代码示例:

3fd923248c07b64e69824db4d39bb314.png


运行结果:

4ae0b9a005c90cb60c5408527be780f1.png



read(byte[],int,int);

此方法也是批量读取,不过是可以控制范围的存放,byte[]代表的是存放的数组,第一个int代表的是存放的起始位,第二个int是代表的读取和存放的长度,然后读取的数据就会按照传递的值来存放在数组位置中。

 

代码示例:

8b8048b916a4ac6ae97cf5c01d756629.png


运行结果:

99adcf6d06e7df916d68da3f7386c32e.png

因为数组的其他位置没有值所以显示的是0

 


skip(long);

此方法用于跳过一些字节,也就是跳过一些读取数据,可以让某些长度的字节跳过不读,返回值是long类型,代表的是具体跳过了多少个字节。

 

代码示例:

bf6bbd72a9db5c87ea1a825c5902610f.png


运行结果:

2e9cb1cce6d87637063f5a256b1a6fa9.png



available();

此方法用于获得文件里剩余的读取字节,返回值是int类型,返回值为0代表读完了,返回0以上的则是表示剩余的字节数量。

代码示例:

d54548414b9067d1f2eafb52f731a3ff.png


运行结果:

32e598c5299c9c718f08bc498970357f.png



close();

此方法用于关闭资源,无返回值。流是有限资源用了就要关闭,不然会发生文件占用的情况。

代码示例:

361508519fbea9fbc4b7a05aeff727d9.png

如何将读取的字节变成字符和字符串?

想要将读取的字节变成字符只需要强制转换一下char类型即可。

代码示例:

4184ac6f9a1ea72bbc20c07b260ed77f.png


运行结果:

b562cc2321078be1ffc6d2bebc864901.png



想要将读取的字节变成字符串,需要使用String类里的一个构造器,将byte数组传递过去就可以直接转换成字符串类型了。

代码示例:

0991278d984a60b7b349dbaa83b460ec.png


运行结果:

0186e9bc5f9d7ecdd8ee53cf0f4a81b8.png



但是上面这种方式,存在一个缺陷,就是最后读取的长度小于数组的长度,后面的元素就会没办法被覆盖掉。所以应该使用一个变量来记录读取的长度,然后每次读取多长就转换多长才不会出现这个问题。

  代码示例:

00722799aeb6839eb46919391a253cb6.png



关于读取中文字符的问题:

在读取中文字符的时候,如果使用单个字符读取是会出问题的,因为一个中文是需要两个字节存储,所以单个读取每次只能读取一个字节,所以自然没办法读取的了。

  代码示例:

d1b3942b06f9655e7d54f2eeff61ea2a.png


运行结果:

2331830ad335e8e9c3e9ffc4844c5ab3.png


解决方法:

将文件里的内容一口气读全部取上来,然后再进行转换就不会有问题了。

代码示例:

a9c62618ccaa468544b1f83bd62ff86d.png


运行结果:

426dfe1b9ac8407edfdc81b657c05c18.png




FileOutputStream文件输出流里的主要方法:

这个类在构建对象的时候可以选择两个模式,一个是追加模式需要写个true,追加模式就是输出的内容不会覆盖文件的内容,而是在后面追加进去,一个是覆盖模式,覆盖模式是会覆盖文件的内容,默认是覆盖模式。

  追加模式写法:

63e30866d2efc8b9b1c788f0a468e601.png


覆盖模式写法:

bd566e68a78078eb47f657292cf96bdc.png


windows操作系统里如果你输出的文件没有创建,系统会自动帮你创建,但是在Linux操作系统则需要自己创建,不然会报错的。

 

write(int);

单个字节输出,需要传递一个int类型的值,这个值代表的是输出的字节。

代码示例:

949d3b826b790210306aff1588d12587.png



write(byte[]);

批量字节输出,需要传递一个byte类型数组,也可以把字符串转换成byte数组输出。

代码示例:

c4d5e45f8a008d675cc9745b382fd0e3.png


write(byte[],int,int);

批量控制范围的输出,作用和FileInputStream里的read(byte,int,int);一样。

代码示例:

f09632466cd2ff60d3e6f1be4b48ec0b.png



flush();

  清理缓存,将输出的缓存清理掉。但是FileOutputStream没有缓存,清不清理都一样,所以这个方法并没有什么卵用,只是留下来的一个方法。

a14c3e2a92029b1dec89392a75f6f0df.png



close();

关闭资源,这个就不必赘述了。

d0891344a289604e1d4d92e666d94375.png