文件流复制文件
我们使用过RandomAccessFile对象进行过文件复制,但是复制的过程比较麻烦。
而java的IO提供了功能更强大的类型来进行类似的操作。
直接复制
package com.tedu.io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 使用流去完成文件的复制操作
* @author Wildmess
*
*/
public class CopyDemo1 {
public static void main(String[] args) throws IOException {
/*
* 1.创建文件输入流,读取出源文件
* 2.创建文件输出流,复制出新文件
* 3.循环从源文件中读去信息写入到新文件中
* 4.关闭流。
*
*/
FileInputStream fis = new FileInputStream("raf.txt");
FileOutputStream fos = new FileOutputStream("raf_copt2.txt");
//创建一个10K的缓存
byte[] data = new byte[1024*10];
int len;
long start = System.currentTimeMillis();
while((len = fis.read(data)) != -1) {
fos.write(data, 0, len);//len表示的是读取出来的多少字节的数据
}
long end = System.currentTimeMillis();
System.out.println("程序运行了" + (end-start)+ "ms");
fis.close();
fos.close();
}
}
使用缓冲流复制文件
仔细观察,很容易就可以看出,如果使用了上述的方法进行文件复制,就和RandomAccessFile没什么区别了,其实IO中提供了缓冲流来提高复制文件的效率。
代码如下:
package com.tedu.io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 使用IO中提供的缓冲流来实现文件复制
*
* java.io.BufferedOutputStream
* java.io.BufferedIutputStream
* 缓冲流是一对高级流,在流连接中的作用是加快数据的读写效率
* (内存会将读写的数据统一转换为块读写的方式,以达到效率提高的目的)
*
* @author Wildmess
*
*/
public class CopyDemo2 {
public static void main(String[] args) throws IOException {
//高级流不能直接指向文件,它创建时需要低级对象
FileInputStream fis = new FileInputStream("raf.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("raf_copy3.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
int d = -1;
long start = System.currentTimeMillis();
while((d = bis.read()) != -1) {
bos.write(d);
}
long end = System.currentTimeMillis();
System.out.println("程序运行了:" + (end - start) + "ms");
bis.close();
bos.close();
}
}
缓冲流的flush方法
void flush()
在实际应用中,不可能要求每一次都要把缓冲流写满后在进行字节写出。
在java的IO中,调用flush()方法可以强制将已经缓存的字节一次性的写出,从而提高数据写出的即时性,但是这也会同时增加实际写出的次数,降低写出效率。
package com.tedu.io;
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 缓冲输出流写出数据缓冲区
* @author Wildmess
*
*/
public class BOSFlushDemo {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("flush.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
System.out.println("程序开始:");
String str = "中华人民共和国万岁!";
byte[] data = str.getBytes();
bos.write(data);
/*
* void flush()
* 强制将当前缓冲区中的字节一次性写出
* 同时缓冲区中的数据也被清空
* 实际上也会增加写出的次数,降低写出效率
*/
bos.flush();
System.out.println("程序结束!");
//事实上,close()方法内部也会调用flush()方法
bos.close();
}
}
在close()方法内部也会调用flush()方法,所以一般情况下这个方法使用的不多。
但如果在编写代码的时候,两个方法都没有使用,读出的字节数据就会一直存在缓冲区中,形成死循环,所以文件流一定要记得关闭。