java学习笔记(7)
一、核心概念与场景
文件复制是IO流的经典应用场景,分为文本文件复制和任意文件复制两类,核心区别在于使用的流类型:
- 文本文件优先用字符缓冲流,操作方便且效率高;
- 图片、视频、音频等二进制文件,只能用字节缓冲流,实现“万能复制”。
二、文本文件复制(字符缓冲流)
字符缓冲流( BufferedReader / BufferedWriter )是文本文件复制的首选,支持按行读取,操作便捷且性能优异。
示例代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TextCopyDemo {
public static void main(String[] args) throws IOException { // 1. 创建字符缓冲输入流,读取源文件 BufferedReader br = new BufferedReader(new FileReader("source.txt")); // 2. 创建字符缓冲输出流,写入目标文件 BufferedWriter bw = new BufferedWriter(new FileWriter("target.txt")); String line; // 3. 按行读取文本,直到文件末尾(返回null) while ((line = br.readLine()) != null) { bw.write(line); bw.newLine(); // 写入换行符,保证格式一致 } // 4. 关闭流(后开先关) bw.close(); br.close(); }}
readLine() 可以直接读取一整行文本,避免手动处理换行符,适合纯文本文件;缓冲流自带8192字节的缓冲区,减少IO次数,比直接用 FileReader / FileWriter 效率高很多。
三、任意文件复制(字节缓冲流,万能复制)
字节缓冲流( BufferedInputStream / BufferedOutputStream )不区分文件类型,支持复制图片、视频、音频、可执行文件等所有格式,是“万能复制”的实现方式。
示例代码
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopyDemo {
public static void main(String[] args) throws IOException { // 1. 创建字节缓冲输入流,读取源文件(如图片、视频) BufferedInputStream bis = new BufferedInputStream(new FileInputStream("1.jpg")); // 2. 创建字节缓冲输出流,写入目标文件 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("2.jpg")); // 3. 创建缓冲区数组,每次读取1024字节 byte[] buf = new byte[1024]; int len; // 4. 循环读取,直到文件末尾(返回-1) while ((len = bis.read(buf)) != -1) { bos.write(buf, 0, len); // 写入实际读取到的字节数,避免多余数据 } // 5. 关闭流(后开先关) bos.close(); bis.close(); }}
字节流按字节读取文件,不会破坏二进制数据,因此能复制任意类型的文件; byte[] buf = new byte[1024] 定义了缓冲区大小,每次批量读写,大幅提升复制效率; write(buf, 0, len) 写入时指定实际读取的字节数,避免写入缓冲区中残留的旧数据。
四、学习总结
文件复制的核心是IO流的分类使用:文本文件优先用字符缓冲流,非文本文件必须用字节缓冲流。缓冲流的存在大幅提升了读写效率,而字节流的通用性让它成为竞赛题中“万能复制”的首选方案。
