Loading

IO流之字节流

FileInputStream

基本使用方法
这里写图片描述

运行结果:
这里写图片描述

FileOutputStream

基本使用方法:

FileOutputStream fos = new FileOutputStream("yyy.txt"); // 如果该文件存在就清空,如果不存在就创建
fos.write(97);
fos.write(98);
fos.write(99);

运行结果:文件中的内容为abc

如果想在文件的末尾追加内容,而不是清空重新写入,只需在构造方法中传入一个true即可

FileOutputStream fos = new FileOutputStream("yyy.txt"true);

拷贝

方法一:
这里写图片描述
这中拷贝方法不推荐,因为它是将字节逐个读取,然后逐个写入,当文件较大时效率太低。

方法二:
这里写图片描述
available()方法可以一次获取到文件的所有字节个数,这样可以一次性将问价拷贝,但当文件过大时,内存会溢出,这种拷贝方法也不推荐。

方法三:定义一个小数组
这里写图片描述

方法四:使用BufferedInputStream和BufferedOutputStream进行拷贝:
这里写图片描述

原理:
BufferedInputStream内置了一个缓冲区(大小为8192的数组),从BufferedInputStream中读取一个字节时, BufferdeInputStream会从文件(硬盘上)中一次读取8192个字节,存入缓冲区(内存中),程序再次读取时,直接从缓冲区中读取(一个一个读取),而不用从文件中读取,因为缓冲区在内存中,所以一个一个读取时也比直接从文件中一个一个读取要快;
BufferedOutputStream也内置了一个缓冲区(大小为8192的数组),程序向流中写出字节时,不会直接写到文件,而是先写到缓冲区,直到缓冲区写满,再一次写到文件。

字节流读写中文

1、字节流读中文:
这里写图片描述
字节流读中文时,因为编码方式的不同,定义的数组大小就要不同,不然会出现乱码,例如我用的是UTF-8,所以数组大小可以定义为3的倍数,但是,即使这样,也会出现乱码,因为可能有标点,所以读中文用字符流,如果非要用字节流,就要用内存输出流即ByteArrayOutputStream。

2、字节流写中文:
这里写图片描述
字节流写中文是不会出现乱码,但要注意代码的编码方式要和zzz.txt文件的编码方式保持一致。

字符流文章链接:http://blog.csdn.net/striverli/article/details/53980602
内存输出流文章链接:http://blog.csdn.net/StriverLi/article/details/57074708

posted @ 2016-11-15 20:33  leon_x  阅读(33)  评论(0)    收藏  举报