You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现输入文件到输出文件拷贝时无法复制完整内容

Java文件内容拷贝不全问题排查与修复

问题复现场景

使用字符流实现文本文件拷贝时,输出文件仅保留输入文件第一行内容。
输入文件示例:
输入文件(writeIntoTextFile)
输出文件示例:
输出文件(writeIntoTextFile1)
原实现代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:57:03