在Java程序(Java1.5)中,我有一个包装了文件写入器的BufferedWriter,并且我多次调用write() ...生成的文件非常大...
在这个文件的行中,有一些是不完整的...
我是不是需要在每次写东西的时候都调用flush (但我怀疑效率会很低),或者使用BufferedWriter的另一个方法,或者使用另一个类……?
(因为我有无数行要写,所以我确实想写一些非常有效的东西。)什么是理想的“冲刷”时刻?(当我达到BufferedWriter的容量时)...
Init:
try {
analysisOutput = new BufferedWriter(new FileWriter(
"analysisResults", true));
analysisOutput.newLine();
analysisOutput.write("Processing File " + fileName + "\n");
}
catch (FileNotFoundException ex) {
ex.printStackTrace();
}
catch (IOException ex) {
ex.printStackTrace();
}写作:
private void printAfterInfo(String toBeMoved,HashMap<String, Boolean> afterMap, Location location)
throws IOException {
if(afterMap != null) {
for (Map.Entry<String, Boolean> map : afterMap.entrySet()) {
if (toBeMoved == "Condition") {
if (1 <= DEBUG)
System.out.println("###" + toBeMoved + " " + location + " "
+ conditionalDefs.get(conditionalDefs.size() - 1)
+ " After " + map.getKey() + " "
+ map.getValue() + "\n");
analysisOutput.write("###" + toBeMoved + " " + location + " "
+ conditionalDefs.get(conditionalDefs.size() - 1)
+ " After " + map.getKey() + " " + map.getValue()
+ "\n");
} else {
if (1 <= DEBUG)
System.out.println("###" + toBeMoved + " " + location + " "
+ map.getKey() + " After "
+ map.getValue() + "\n");
if (conditionalDefs.size() > 0)
analysisOutput.write("###" + toBeMoved + " " + location + " "
+ conditionalDefs.get(conditionalDefs.size() - 1) + " "
+ map.getKey() + " After " + map.getValue()
+ "\n");
else
analysisOutput.write("###" + toBeMoved + " " + location + " " + map.getKey() + " After " + map.getValue() + "\n");
}
}
}我刚刚发现那些不完整的行就是“正在处理文件”之前的那些行……所以当我从一个要分析的文件切换到另一个文件时,就会发生这种情况。
结语:
dispatch(unit);
try {
if (analysisOutput != null) {
printFileInfo();
analysisOutput.close();
}
}
catch (IOException ex) {
ex.printStackTrace();
}有时由printFileInfo打印的信息不会出现在结果文件中...
发布于 2009-05-25 22:03:37
当BufferedWriter填充它的缓冲区时,它已经刷新了。来自BufferedWriter.write的文档
通常,此方法将给定数组中的字符存储到此流的缓冲区中,并根据需要将缓冲区刷新到基础流。
(重点是我的。)
BufferedWriter的要点基本上是将大量的小写操作合并到更少的大写操作中,因为这通常更有效(但编码起来更痛苦)。不过,你不需要做任何特殊的事情来让它正常工作,除了确保在你完成它的时候刷新它--调用close()将会这样做,并且无论如何都会刷新/关闭底层的编写器。
换句话说,放松--只需要写,写,写和关闭:)你通常唯一需要手动调用flush的时候就是你真的真的需要数据在磁盘上的时候。(例如,如果您有一个永久日志记录器,您可能希望经常刷新它,这样任何正在读取日志的人都不需要等到缓冲区满了才能看到新的日志条目!)
发布于 2009-05-25 21:55:59
理想的刷新时刻是在文件关闭之前,您需要另一个程序读取该文件以查看已写入的数据。在许多情况下,这是永远不会发生的。
发布于 2018-10-11 22:12:31
如果您有一个交替使用init和printAfterInfo的循环,我猜测您的问题是,在同一文件上创建新的编写器之前,您不会close您的编写器。您最好创建一次BufferedWriter,并在所有处理结束时关闭它。
https://stackoverflow.com/questions/908168
复制相似问题