2017-03-21 40 views
1

我正在用bufferedWriter和FileWriter將一個記錄器寫入我的java程序(採用csv格式)。在java中寫入文件 - 關閉或刷新

當我在程序運行時打開csv文件並繼續寫入文件時,出現以下異常:「進程無法訪問該文件,因爲它正在被另一進程使用」。

我想要的是,當我在程序運行時打開csv文件時,csv文件將以讀取模式打開,程序將成功寫入文件。

我解決它通過改變的BufferedWriter和FileWriter的的閉合到.flush()代替.close()

原始最小記錄器的代碼(與原來的關閉功能)

public class logger { 
    private BufferedWriter bw = null; 
    private FileWriter fw = null; 
    private File file = null; 

    logger(String nclass) { 

     path = "c:\\test\\test.csv"; 
     this.file = new File(path); 

     // Check if the file is already exist. 
     if (!file.exists()) { 
      file.createNewFile(); 
     } 

     fw = new FileWriter(file.getAbsoluteFile(), true); 
     bw = new BufferedWriter(fw); 
    } 
    public void writeToFile(String msg) { 
    entryWrite(); 

    try { 

     fw = new FileWriter(file.getAbsoluteFile(), true); 
     bw = new BufferedWriter(fw); 
     fw.append(msg); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     close(); 
     exitWrite(); 
    } 
} 

}

private void close() { 
try { 
    if (bw != null) { 
     bw.close(); 
     bw = null; 
    } 
    if (fw != null) { 
     fw.close(); 
     fw = null; 
    } 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} 

}

我的解決方案功能

private void close() { 
try { 
    if (bw != null) { 
     bw.flush(); 
     bw = null; 
    } 
    if (fw != null) { 
     fw.flush(); 
     fw = null; 
    } 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} 

}

現在,我的回答是,如果它是確定不關閉流,只是沖水使用? 以後會有什麼問題嗎?因爲在我所有的測試中它運行良好。

謝謝!

+1

請顯示完整[mcve];你錯過了很多重要的方面。對於初學者來說,我猜你正在使用FileWriter創建你的BufferedWriter;所以你爲什麼要在這兩種方法上調用方法(你只需要刷新/關閉外部作者!) – GhostCat

+0

@GhostCat - 我已添加。 – Idon89

+0

應該關閉爲DUP http://stackoverflow.com/questions/16584777/is-it-necessary-to-close-a-filewriter-provided-it-is-written-through-a-buffered ...和答案是現貨:這段代碼真的......對不起,不好。 – GhostCat

回答

1

以一種非常謙虛的方式,它會好起來一些誠實嗎?對不起但臭的代碼:

  1. 爲什麼設置爲null「bw」和「fw」?, globals ?,爲什麼?
  2. 「ex.printStackTrace();」 ?真的?,沒有log4j或類似?
  3. 爲什麼不使用finally塊?如果在讀寫文件時發生異常會發生什麼?
  4. 有人已經回答了這一點,代碼是指這個優秀的答案:

Is it necessary to close a FileWriter, provided it is written through a BufferedWriter?

+0

我將大部分代碼添加到了我的主文章中。 \t 1.我不知道,它是一個問題? \t 2.我不需要log4j,因爲我把程序的所有錯誤寫入了我的記錄器。當我與記錄器有一個問題時,我看到它住在java中。 \t 3.當我完成寫入文件時,我終於使用了塊。看看我更新的代碼。 \t 4.謝謝。所以你認爲使用flush可以安全地關閉嗎? – Idon89

0

只是做bufferedWriter物體接近。

bw.close();

說,你有一個大file.txt。 現在你要從文件中取出一些東西,並且每次都製作一個新的小文本文件。 在這種情況下, 不知何故,您必須編寫一些代碼行來確定何時完成在特定文件上的寫入。然後用標誌來寫bw.close();

最終,您必須初始化第二個文件並完成您的任務。然後bw。關();

如果你不寫fw.close(),那麼文件將是空的。所以,確保每個文件寫入操作你必須寫bw.close()