【发布时间】:2009-05-25 21:52:59
【问题描述】:
在 Java 程序(Java 1.5)中,我有一个包装 Filewriter 的 BufferedWriter,我多次调用 write()...生成的文件非常大...
在这个文件的几行中,有些是不完整的……
每次我写东西时是否需要调用flush(但我怀疑它会效率低下)或使用另一种BufferedWriter方法或使用另一个类...?
(因为我有无数行要写,我确实想要一些非常有效的东西。) 什么是理想的“冲洗”时刻? (当我达到 BufferedWriter 的容量时)...
初始化:
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打印出来的信息不会出现在结果文件中……
【问题讨论】:
-
如果有些不完整,您是否有多个线程写入它? IIRC BufferedWriter 不是线程安全的,所以这可能是一种解释,但它不必“手动刷新”以腾出更多空间,它自己会处理。
-
如果你不确定你的问题是否清楚,也许提供一个代码示例或输出示例来澄清。
-
它实际上是线程安全的(尽管 Writer 装饰器在同意锁定什么对象方面存在问题)。
-
如何确定这是线程安全的?我正在写一个静态文件并使用 make -j (我猜这是多线程的......)
-
我会在 printFileInfo() 方法中寻找错误。