2012-09-06 18 views
0

這是我的代碼片段。寫入相同的文件;不會覆蓋

File file = new File(Thread.currentThread().getName()); 

for(each element of the list){ 
createStringWriterAndPopulateDataToBeWritten 
FileOutputStream fo = new FileOutputStream(file); 
OutputStreamWriter out = new OutputStreamWriter(fo,"UTF-8"); 
out.write(sw.toString()); 
out.close(); 
} 

現在說我有大小SnewFixedThreadPool;我通過這個線程池來完成一個工作列表。現在每次調用線程時,都會創建一個名稱爲線程名稱的文件,然後寫入該文件,但在循環中它只是覆蓋文件。

即使再次調用線程,如何才能使其追加並不覆蓋,因爲我的線程池工作列表相當長,在這種情況下可能會發生這種情況。

注意:傳遞給ThreadPool的作業列表中的每個元素也是一個列表,這就是爲什麼在代碼片段中存在for循環的原因。

謝謝。

回答

2

但在循環中它只是覆蓋文件。

嗯,是 - 你創建的循環的FileOutputStream。如果您在之前創建了FileOutputStream(和OutputStreamWriter循環,那麼只需在循環中進行寫入操作,它將爲整個操作創建單個文件。

請注意,close調用應位於finally塊中,因此即使代碼引發異常,您也可以關閉該作者。

如果需要追加到該文件,如果該代碼被再次調用,只是改變這一點:

FileOutputStream fo = new FileOutputStream(file); 

FileOutputStream fo = new FileOutputStream(file, true); 

第二個參數,按照the documentation,狀態是否追加(true)或覆蓋(false)。

+0

所以即使我在循環中創建fileOutputStream並保持第二個參數爲true;它應該工作呃? 不是一個好的做法,但它仍然適用? – Kraken

+0

因爲再次調用相同的代碼將等同於在循環內調用fileoutputStream?謝謝 – Kraken

+0

@Kraken:它會工作,但效率非常低。將文件打開一次,寫入所有內容,然後關閉它將會變得非常乾淨。重新打開它,以便在需要時追加數據,但是當您知道*要寫入更多內容時,不會在循環的每次迭代中進行追加。 –

相關問題