package cn.itcast.chapter07.example06;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
/**
* BufferedInputStream和BufferedOutputStream 这两个流的用法
*/
public class Example06 {
public static void main(String[] args) throws Exception {
// 创建一个带缓冲区的输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\IDEA-IO\\src\\五环之歌.mp3"));
// 创建一个带缓冲区的输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\IDEA-IO\\des\\五环之歌.mp3"));
long begintime = System.currentTimeMillis(); // 获取拷贝文件前的系统时间
int len;
while ((len = bis.read()) != -1) {
bos.write(len);
}
long endtime = System.currentTimeMillis(); // 获取文件拷贝结束时的系统时间
System.out.println("拷贝文件所消耗的时间是:" + (endtime - begintime) + "毫秒");
bis.close();
bos.close();
}
}
输出
拷贝文件所消耗的时间是:94毫秒
4、字节缓冲流+缓冲区(效率最高)
package cn.scanner.cn.copyFile;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
/**
* @author wangyue
* @version 1.0
* @date 2019/7/4 17:10
* @describe: 测试拷贝文件的几种方法
*/
public class TestCopyFile {
public static void main(String[] args) throws Exception {
// 创建一个带缓冲区的输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\IDEA-IO\\src\\五环之歌.mp3"));
// 创建一个带缓冲区的输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\IDEA-IO\\des\\五环之歌.mp3"));
// 定义一个字节数组,作为缓冲区
byte[] buff = new byte[1024];
long begintime = System.currentTimeMillis(); // 获取拷贝文件前的系统时间
int len;
while ((len = bis.read(buff)) != -1) {
bos.write(buff, 0, len); // 从第一个字节开始,向文件写入len个字节
}
long endtime = System.currentTimeMillis(); // 获取文件拷贝结束时的系统时间
System.out.println("拷贝文件所消耗的时间是:" + (endtime - begintime) + "毫秒");
bis.close();
bos.close();
}
}
输出
拷贝文件所消耗的时间是:16毫秒
二、字符流复制文件
字符流也可以拷贝文本文件,但不推荐使用
因为读取时会把字节转为字符,写出时还要把字符转回字节
1、通过缓冲流完成文件的复制
使用BufferedReader和BufferedWriter完成文件的复制BufferedReader中的方法 public String readLine() 读一行字符BufferedWriter中的方法 public void newLine() 写入一个换行符
package cn.itcast.chapter07.example09;
import java.io.*;
/**
* 使用BufferedReader和BufferedWriter完成文件的复制
*
* BufferedReader中的方法
* public String readLine() 读一行字符
*
* BufferedWriter中的方法
* public void newLine() 写入一个换行符
*/
public class Example09 {
public static void main(String[] args) throws Exception {
// 创建一个BufferedReader缓冲对象,用于读取文件数据
BufferedReader in=new BufferedReader(new FileReader("D:\\IDEA-IO\\src\\五环之歌.mp3"));
// 创建一个BufferedWriter缓冲对象,用于写文件数据
BufferedWriter out=new BufferedWriter(new FileWriter("D:\\IDEA-IO\\des\\五环之歌.mp3"));
String line=null;
long begintime = System.currentTimeMillis();
// 每次读取一行文本,判断是否到文件末尾
while ((line = in.readLine()) != null) {
out.write(line);
out.newLine(); // 写入一个换行符,该方法会根据不同的操作系统生成相应的换行符
out.flush(); //也可以不写,在关闭数据流时,会自动刷新
}
long endtime = System.currentTimeMillis();
System.out.println("拷贝文件所消耗的时间是:" + (endtime - begintime) + "毫秒");
in.close();
out.close();
}
}
输出
拷贝文件所消耗的时间是:460毫秒
2、通过转换流复制文件
前面IO流可以分为字节流和字符流,有时字节流和字符流之间也需要进行转换。在JDK中提供了两个类可以将字节流转换为字符流,分别是InputStreamReader和OutputStreamWriterOutputStreamWriter是Writer的子类,它可以将一个字节输出流转换成字符输出流,方便直接写入字符,InputStreamReader是Reader的子类,它可以将一个字节输入流转换成字符输入流,
package cn.itcast.example10;
import java.io.*;
/**
* @author wangyue
* @version 1.0
* @date 2019/7/3 10:01
* @describe: 转换流:
*/
public class Example10 {
public static void main(String[] args) throws IOException {
//指定输入流
FileInputStream in = new FileInputStream("D:\\IDEA-IO\\src\\五环之歌.mp3");//创建字节输入流
InputStreamReader isr = new InputStreamReader(in); //将字节输入流转换成字符输入流
BufferedReader br = new BufferedReader(isr); //高效缓冲流包装
//指定输出流
FileOutputStream out = new FileOutputStream("D:\\IDEA-IO\\des\\五环之歌.mp3");//创建字节输出流
OutputStreamWriter osw = new OutputStreamWriter(out);
BufferedWriter bw = new BufferedWriter(osw);
//读数据
String line = null;
long begintime = System.currentTimeMillis();
while ((line = br.readLine()) != null) { //是否读到文件末尾
//写数据
bw.write(line);
bw.newLine();
bw.flush();
}
long endtime = System.currentTimeMillis();
System.out.println("拷贝文件所消耗的时间是:" + (endtime - begintime) + "毫秒");
//关闭流
br.close(); //只要关闭最后的缓冲流即可
bw.close();
}
}
输出
拷贝文件所消耗的时间是:545毫秒
注意事项
1.字符流也可以拷贝文本文件,但不推荐使用因为读取时会把字节转为字符,写出时还要把字符转回字节。
2.不可以拷贝非纯文本的文件
因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替;写出的时候会将字符转换成字节写出去,如果是?,直接写出,这样写出之后的文件就会产生乱码。
3.使用情况
程序需要读取一段文本,或者需要写出一段文本的时候可以使用字符流
读取的时候是按照字符的大小读取的,不会出现半个中文
写出的时候可以直接将字符串写出,不用转换为字节数组————————————————
原文链接:https://blog.csdn.net/wangpailiulanqi8/article/details/94631753