我们平时在使用计算机的过程中,会用到一个非常常用的操作:复制粘贴。

它可以将一个文件复制成另一个文件。

根据我们昨天学的两种字符流,面对这种需求该如何操作?

一、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),还可以继续编辑。