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

Java读取CSV文件并重定向日志文件却生成空文件求助

解决你的Java日志文件为空问题

嘿,我帮你揪出代码里导致日志文件为空的几个关键问题啦,咱们一步步来修正:

问题分析

你的代码里有三个核心问题:

  • 没有输出读取到的内容:你只是把System.out重定向到了日志文件的PrintStream,但从头到尾都没调用输出语句把读取到的行写入文件,自然生成的文件是空的。
  • 循环内重复创建PrintStream:每次循环都新建PrintStream,这不仅会反复覆盖文件内容(默认模式是覆盖而非追加),还会造成资源泄漏,旧的流没被关闭。
  • 资源未正确关闭:FileReader、BufferedReader、PrintStream这些IO资源用完后必须关闭,否则可能导致数据没被刷入文件,还会占用内存。

修正后的代码

import java.io.*;

public class FileLogger {
    public static void main(String[] args) {
        // 使用try-with-resources语法,自动关闭所有实现AutoCloseable的资源
        try (FileReader f = new FileReader("C:\\file.txt");
             BufferedReader sr = new BufferedReader(f);
             PrintStream p = new PrintStream(new File("C:\\file_log.txt"))) {
            
            String s;
            // 保存原控制台输出,可选,如果你之后还要恢复的话
            PrintStream console = System.out;
            // 重定向System.out到日志文件
            System.setOut(p);
            
            while ((s = sr.readLine()) != null) {
                // 关键:把读取到的行输出到重定向后的System.out(也就是日志文件)
                System.out.println(s);
            }
            
            // 可选:恢复控制台输出
            System.setOut(console);
            
        } catch (FileNotFoundException e) {
            System.out.println("请检查文件是否在指定路径存在");
        } catch (IOException e) {
            System.out.println("读取或写入文件时发生错误:" + e.getMessage());
        }
    }
}

修正点说明

  1. 用try-with-resources语法包裹所有IO资源,不用手动调用close(),Java会自动帮你关闭,避免资源泄漏。
  2. 把PrintStream的创建移到循环外面,避免重复创建和覆盖文件。
  3. 在循环内添加System.out.println(s),把读取到的每一行写入日志文件。
  4. 新增了IOException的捕获,处理读取文件时可能出现的IO异常(比如文件读取失败)。

这样修改后,你的日志文件就能正确写入读取到的16条记录啦!

内容的提问来源于stack exchange,提问作者pankaj malvi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:38:28