一、文件的拷贝
文件的拷贝是通过输入流来读取文件的数据,通过输出流把数据写入文件。怎么进行文件复制的呢?使用FileInputStream类与FileOutputStream类复制文件。
首先在text文件夹下创建一个test06.txt文件,并写入内容为“Java进阶学习交流001、Java进阶学习交流002、Java进阶学习交流003”,如下图所示:
代码实现文件的拷贝如下所示:
- import java.io.*;
- public class P06 {
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- //创建一个字节输入流,读取text文件夹下test06.txt数据
- InputStream in = new FileInputStream("text/test06");
- //创建一个字节输出流,用来读取数据并在text文件夹下创建一个test07.txt文件
- OutputStream out = new FileOutputStream("text/test07");
- int num;//定义个int类型的变量num,保存每次读取的一个字节
- //复制文件前的系统时间
- long startTime=System.currentTimeMillis();
- //while循环判断读取的一个字节是否读到文件的末尾
- while((num=in.read())!=-1){
- //读到的数据写到文件中
- out.write(num);
- }
- //复制文件后的系统时间
- long endTime=System.currentTimeMillis();
- System.out.println("复制文件所使用的时间是:"+(endTime-startTime)+"毫秒");
- //关闭流
- in.close();
- out.close();
- }
- }
运行的结果如下图所示:
二、字节流的缓冲区
在实现文件拷贝时,如果一个个字节来读写,经常操作文件这样的效率太低了。首先创建一个字节数组来保存一次性读取多个字节的数据,再把字节数组中的数据一次性写入文件。这里的缓冲区相当字节数组!
如何使用缓冲区拷贝文件?
(1)首先在text文件夹下创建一个test08.txt文件,并写入内容为“HelloWorld,Java程序设计001!、HelloWorld,Java程序设计002!、HelloWorld,Java程序设计003!、HelloWorld,Java程序设计004!、HelloWorld,Java程序设计005!、HelloWorld,Java程序设计006!”,如下图所示:
(2)代码如下所示:
- import java.io.*;
- public class P07 {
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- //创建一个字节输入流,读取text文件夹下test08.txt数据
- InputStream in = new FileInputStream("text/test08");
- //创建一个字节输出流,用来读取数据并在text文件夹下创建一个test09.txt文件
- OutputStream out = new FileOutputStream("text/test09");
- //定义字节数组使用缓存区读写文件数据
- byte bt[]=new byte[1024];
- //定义一个int类型的变量num,保存读取读到缓冲区的字节数
- int num;
- //复制文件前的系统时间
- long startTime=System.currentTimeMillis();
- //while循环判断读取的字节是否读到文件的末尾
- while((num=in.read(bt))!=-1){
- out.write(bt,0,num);
- }
- //复制文件后的系统时间
- long endTime=System.currentTimeMillis();
- System.out.println("复制文件所使用的时间是:"+(endTime-startTime)+"毫秒");
- //关闭流
- in.close();
- out.close();
- }
- }
运行的结果如下图所示:
上面代码中主要实现了test08.txt文件的拷贝,拷贝过程中使用到了while循环将字节文件进行拷贝,每循环一次在test08.txt文件中读取很多个字节保存到数组中,通过变量num保存读取的数组的字节数,从数组的第一个字节开始,把num个字节写到文件中,当num值为-1,读取文件就结束了。最终实现了文件之间的拷贝是通过字节流的缓冲区。
三、BufferedInputStream类
BufferedInputStream是缓冲输入流,可以减少访问磁盘的次数,提高文件的读取性能,它是FilterInputStream类的子类。
BufferedInputStream作用它相对于普通输入流优点是,它有一个缓冲数组,每次去调用read()方法,先从缓冲区读取数据,如果读取数据失败,从文件读取新数据放到缓冲区,再把缓冲区的内容显示出来。
如何用BufferedInputStream类读取文本内容?
(1)定义一个字节数组bt,再通过循环把文本内容循环读到bt中,再把读取到的数据显示出来。
(2)首先再text文件夹下创建一个test10.txt文件并写入"Java进阶学习交流001!"的内容。
(3)代码的实现:
- import java.io.*;
- public class P08 {
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- //创建一个带有缓冲区的输入流
- BufferedInputStream bi = new BufferedInputStream(new FileInputStream("text/test10"));
- //定义字节数组
- byte[] bt = new byte[1024];
- int num = 0;
- //判断是否读到文件的末尾
- while ((num = bi.read(bt)) != -1) {
- //读取的字节转为字符串对象
- String s = new String(bt, 0, num);
- System.out.println("读取的内容是:"+s);
- }
- //关闭流
- bi.close();
- }
- }
运行的结果如下图所示:
四、总结
本文主要介绍了文件的拷贝、字节流的缓冲区、BufferedInputStream类。文件的拷贝是输入流来读取文件的数据,通过输出流把数据写入文件。字节流的缓冲区创建一个字节数组来保存一次性读取多个字节的数据,再把字节数组中的数据一次性写入文件。BufferedInputStream是缓冲输入流,可以减少访问磁盘的次数,提高文件的读取性能,它是FilterInputStream类的子类;它有一个缓冲数组,每次去调用read()方法,先从缓冲区读取数据,如果读取数据失败,从文件读取新数据放到缓冲区,再把缓冲区的内容显示出来。希望通过本文的学习,对你有所帮助!
本文转载自微信公众号「Java进阶学习交流」,可以通过以下二维码关注。转载本文请联系Java进阶学习交流公众号。