Java实现输入文件到输出文件拷贝时无法复制完整内容
Java文件内容拷贝不全问题排查与修复
问题复现场景
使用字符流实现文本文件拷贝时,输出文件仅保留输入文件第一行内容。
输入文件示例:
输出文件示例:
原实现代码:
import java.io.*; public class ReadandWrite { public static void main(String[] args) throws IOException { FileReader fr = new FileReader("D:\\writeIntoTextFile.txt"); BufferedReader br = new BufferedReader(fr); BufferedWriter bw = new BufferedWriter( new FileWriter("D:\\writeIntoTextFile1.txt")); bw.write(br.readLine()); bw.close(); } }
问题产生原因
- 核心问题是仅调用了一次
BufferedReader.readLine()方法,该方法每次只会读取文件中的一行内容,读取到行尾后下一次调用才会读取下一行,读到文件末尾时会返回null。仅调用一次自然只会写入第一行内容。 readLine()返回的内容会自动去除行尾的换行符,直接写入会导致输出文件丢失原有换行格式。- 原代码未主动关闭输入流,存在资源泄漏风险。
修复方案
修复后代码
import java.io.*; public class ReadandWrite { public static void main(String[] args) throws IOException { // try-with-resources会自动关闭所有流资源,无需手动调用close try (BufferedReader br = new BufferedReader(new FileReader("D:\\writeIntoTextFile.txt")); BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\writeIntoTextFile1.txt"))) { String contentLine; // 循环读取所有行直到文件末尾 while ((contentLine = br.readLine()) != null) { bw.write(contentLine); // 补充换行符,保留原文件格式 bw.newLine(); } } } }
修改点说明
- 新增循环读取逻辑,遍历输入文件所有行内容,保证全部内容都写入输出文件。
- 每次写入一行后调用
newLine()方法补充换行符,和原文件格式保持一致。 - 使用try-with-resources语法自动管理流资源,避免资源泄漏问题。
提示:如果需要拷贝非文本类文件(图片、视频、压缩包等),不要使用字符流,改用
BufferedInputStream和BufferedOutputStream字节流实现,避免编码转换导致文件损坏。
内容的提问来源于stack exchange,提问作者Venkat P
相关产品推荐
相关产品推荐

