【问题标题】:Results printing to console but not to the file结果打印到控制台但不打印到文件
【发布时间】:2014-03-14 18:20:37
【问题描述】:

我正在尝试像这样打印到 .csv:

(A和B是String类型的ArrayLists)

for(int i = 0; i < A.size(); i++) {
    PrintWriter output = new PrintWriter(csvFile);
    System.out.println(A.get(i)+", "+ B.get(i));
    output.println(A.get(i)+", "+ B.get(i));
}

我在控制台上得到了想要的结果,但是当我尝试覆盖我正在读取的文件时,它完全是空白的。有任何想法吗?我确实需要覆盖文件,因为我不希望保留原始数据。

【问题讨论】:

  • 什么是csvFile?是File,还是String?另外,为什么不指定编码?

标签: java csv file-io


【解决方案1】:

你有两个问题。

首先,这个:

PrintWriter output = new PrintWriter(csvFile);

截断文件。这意味着您在每次循环迭代时截断文件。

其次,PrintWriter 不会自动将其内容刷新到目标,您也不会.flush() 它。由于您的文件是空的,这也意味着您可能忘记.close()它。

假设您使用 Java 7,请改用它(注意:假设 csvFileString;如果是 File,请在下面的代码提取中使用 csvFile.toPath() 而不是 Paths.get(csvFile)):

try (
    final BufferedWriter w = Files.newBufferedWriter(Paths.get(csvFile),
        StandardCharsets.UTF_8, StandardOpenOption.CREATE);
    final PrintWriter writer = new PrintWriter(w);
) {
    for(int i = 0; i < A.size(); i++) {
        System.out.println(A.get(i)+", "+ B.get(i));
        writer.println(A.get(i)+", "+ B.get(i));
    }
    writer.flush();
}

【讨论】:

  • 所以flush方法首先做两件事将确保流被完全清除并将数据写入文件+关闭流??
  • 谢谢。这解决了我的问题。 csvFile 实际上是一个字符串。为什么我需要指定编码? (我假设这是您对第 3 行所做的)对不起.. 我对此非常陌生。
  • 这里我使用 try-with-resources 语句。它会自动为您拨打.close().flush() 不是 .close()
  • 另外,“为什么我需要指定编码?”
【解决方案2】:

关闭你的 PrintWriter output.close();

PrintWriter output = new PrintWriter(csvFile);
System.out.println(A.get(i)+", "+ B.get(i));
output.println(A.get(i)+", "+ B.get(i));
output.close();

【讨论】: