Java IO 文件复制:字符缓冲流 & 字节缓冲流
一、前言
在 Java IO 日常开发中,文件复制是十分常用的功能,根据文件类型不同分为两种实现方案:字符缓冲流用于文本文件复制,字节缓冲流可以实现所有类型文件的复制。本文从适用场景、原理、代码实现两方面介绍两种缓冲流。
二、两种缓冲流适用场景说明
字符缓冲流:仅用于 txt、java、md 这类纯文本文件读写复制,依靠字符编码解析内容,无法处理图片、视频、压缩包等二进制文件。
字节缓冲流:基于原始二进制数据读写,支持所有格式文件,文本、图片、视频、压缩包、可执行程序都能无损复制。
缓冲流内部自带默认 8192 字节缓冲区,相比基础的文件流单字节读写,减少频繁磁盘 IO 访问,大幅提升文件读写效率。
三、字符缓冲流实现文本文件复制
BufferedReader 负责文件字符读取,提供按行读取方法 readLine ();BufferedWriter 负责字符写出,newLine () 方法可以自动添加换行符,适配不同操作系统换行格式。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TextCopyByCharBuffer {
public static void main(String[] args) {
String srcPath = "source.txt";
String destPath = "target.txt";
BufferedReader br = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new FileReader(srcPath));
bw = new BufferedWriter(new FileWriter(destPath));
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
}
System.out.println("文本文件复制完成!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) br.close();
if (bw != null) bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
优缺点:
优点:按行处理文本,代码简洁,方便对每行内容做额外处理,适配中文文本。
缺点:不能操作二进制文件,强行复制图片、视频会导致文件损坏无法打开。
四、字节缓冲流实现全类型文件复制
BufferedInputStream 读取文件原始字节数据,BufferedOutputStream 原样输出字节数据,不受文件编码、文件格式限制,是通用的文件复制方案。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class AnyFileCopyByByteBuffer {
public static void main(String[] args) {
String srcPath = "test.jpg";
String destPath = "copy_test.jpg";
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(new FileInputStream(srcPath));
bos = new BufferedOutputStream(new FileOutputStream(destPath));
byte[] buf = new byte[1024];
int len;
while ((len = bis.read(buf)) != -1) {
bos.write(buf, 0, len);
}
bos.flush();
System.out.println("文件复制成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bis != null) bis.close();
if (bos != null) bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
优缺点:
优点:通用性极强,任何后缀的文件都能完整复制,开发中不确定文件格式优先使用字节缓冲流。
缺点:无法直接按行读取文本内容,需要手动拆分换行字符。
五、JDK7 新特性 try-with-resources 简化写法
JDK7 开始实现 AutoCloseable 接口的流可以在 try () 中定义,代码执行完毕自动关闭流,省去 finally 手动释放资源。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TryWithResourceCopy {
public static void main(String[] args) {
try(BufferedReader br = new BufferedReader(new FileReader("src.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("dest.txt"))){
String line;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
六、总结
1.只处理纯文本文件时,选用字符缓冲流 BufferedReader+BufferedWriter;
2.复制图片、视频、压缩包等未知格式文件时,选用字节缓冲流BufferedInputStream+BufferedOutputStream。
更多推荐
所有评论(0)