我们平时在使用计算机的过程中,会用到一个非常常用的操作:复制粘贴。
它可以将一个文件复制成另一个文件。
根据我们昨天学的两种字符流,面对这种需求该如何操作?
一、IO流复制文件
说白了,复制文件的过程就是一边读一边写的过程。代码如下:
1.方法一
①创建输入流:
a.jpg是计算机里已经存在的文件,所以创建输入流将其读取到内存。
②创建输出流:
我们需要将a.jpg复制下来,那么文件名我们可以自己定义名字,在创建输出流时,直接创建该文件。
③复制文件:
使用fis.read()可以读取文件,使用fos.write(read)可以将读到的内容写入文件。
最后不要忘了使用close方法关流。
这样运行代码,就可以将“a.jpg”文件复制成“刘小爱.jpg”。以上方法为一个字节一个字节地读取与写入,同样的道理,也可以一个字节数组一个字节数组地读取与写入。
代码如下:
2.方法二
首先定义一个字节数组buffer;
其次将文件的内容按照数组长度读取到buffer中;
最后同时将buffer写入另一个文件。
这两种方式,哪种方式更有效率?自然是第二种方式更有效率。
为什么呢?
以一个我们现实生活中的例子来理解就是:
字节就好比是杯子,字节数组就好比是桶。
是用桶打水快,还是用杯子打水快?问题显而易见。
这个例子可能不算准确,但确实更加地好理解。
以上就是昨天学习的两种字节流的应用。今天再学习两种字符流:
二、字符流
1.字符输入流
Reader是一个抽象类,是用于读取字符流的所有类的最上层父类,其中FileReader类是其常用子类。
a.txt中的内容为:刘小爱
①使用字节输入流读取文件
“刘小爱”读取的结果是9个字节,也就是说在字节流中,一个中文是3个字节。
②使用字符输入流读取文件
“刘小爱”读取的结果是3个字符。
所以字符说白了就是字节+编码表:
其中ASCII码表是最基础的编码表;
中国也有自己的编码表GBK;
UTF-8编码,这是一个国际通用编码,最常用。
在开发中一般也就是使用这个UTF-8编码。
其中编码和解码的编码表要一致,不然会出现乱码,也就是读文件和写文件时的编码表要是一样的。
以上是一个字符一个字符地输入,同样的道理,也可以一个字符数组一个字符数组地输入。
2.利用char数组输入
首先定义一个固定长度的字符数组char[];
然后将文件按char数组长度读到char数组中;
最后将char数组以字符串的形式打印出来。
3.字符输出流
Writer也是一个抽象类,是用于写出字符流的所有类的最上层父类,其中FileWriter 类是其常用子类。
①使用writer方法直接写入字符
数字会按照ASCII码表转换成对应的字符。
②使用writer方法直接写入字符串
字符串其实也就相当于是一个字符数组,所以写入一个字符数组可以,直接写入一个字符串也可以。
③close方法关流
如果不关流的话,是无法将内容写入文件里面的,所以得关流。
但是一旦关流了,就没法再次写入了,想再次写入,又得创建输出流。
如果仅仅只是想保存,还希望继续编辑怎么办呢?
这就要使用到另一个方法叫flush。
4.close和flush
①flush方法
flush,刷新的意思,也就是说我们写入了一个数据,得刷新下才会将数据保存。在使用flush方法后,还可以继续写入文件。
②close方法
close方法,关流,它在关流时底层会调用flush方法。在使用close方法后,就不可以继续写入文件了。
总之close和flush的区别:
close就好比我们写东西在记事本上,保存并退出编辑。
flush就好比我们写记事本,点保存但是没退出(Ctrl+s),还可以继续编辑。