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()); } } }
修正点说明
- 用try-with-resources语法包裹所有IO资源,不用手动调用
close(),Java会自动帮你关闭,避免资源泄漏。 - 把
PrintStream的创建移到循环外面,避免重复创建和覆盖文件。 - 在循环内添加
System.out.println(s),把读取到的每一行写入日志文件。 - 新增了
IOException的捕获,处理读取文件时可能出现的IO异常(比如文件读取失败)。
这样修改后,你的日志文件就能正确写入读取到的16条记录啦!
内容的提问来源于stack exchange,提问作者pankaj malvi
相关产品推荐
相关产品推荐

