-1

我正在使用 BufferedWriter 将一些数据写入文本文件。它比使用 ODBC 写入 Access 更快。代码看起来像这样:

BufferedWriter bw = new BufferedWriter(new FileWriter(new File(filePath), true));

True 是让 BufferedWriter 追加,而不是覆盖。

bw.append(          
    country + "\t" +
    scenario + "\t" +
    tempStage + "\t" +
    year + "\t" +
    tempState
);

它在以前的项目中对我有用。新问题:它只是在行的中间胡扯。这是一条很好的线:

SultanateOfBrunei   BeeBeeScenario  Other   2019

最后一行通常如下所示:

SultanateOfBrunei   BeeBeeScenario  Other   2019 Nondyna

或苏丹

甚至苏

我输入了错误处理代码来忽略这样奇怪的不完整行。

这意味着并非所有数据都被写入。我可以放弃一个数据,没问题……但它似乎截断了更多。模拟从 1990 年运行到 2020 年底,通常在 2019 年某个地方结束。增加虚拟机有一点帮助——它会走得更远。但我只有一定的记忆力!

有什么见解吗?

谢谢!!

4

4 回答 4

5

您的应用程序可能没有关闭 BufferedWriter,因此输出的最后一部分没有被写入文件。

你的程序结构应该是这样的:

BufferedWriter bw = new BufferedWriter(new FileWriter(new File(filePath), true));
try {
    // generate output
} finally {
    bw.close();
}

请注意,这不会尝试处理在打开、写入或关闭 writer 时可能出现的 I/O 异常。你是否应该这样做,以及你应该如何处理你捕获的任何异常取决于具体情况。

于 2012-09-21T15:49:17.397 回答
1

可能您bw.flush()在关闭流之前没有刷新 ( ) 流。应该对所有流都这样做,但对缓冲流更重要。

于 2012-09-21T15:48:15.440 回答
1

您只需要关闭 BufferedWriter。如果你不这样做,最后填充的缓冲区可能不会被写入。

于 2012-09-21T15:51:01.813 回答
1

完成编写后,您实际上应该调用close()BufferedWriter 对象。这将确保您的流被刷新并因此关闭。

于 2012-09-21T15:51:14.550 回答