簡體   English   中英

使用BufferWriter從多個類寫入同一文件

[英]Write to the same file using BufferWriter from multiple classes

我想將結果輸出到文件中。 我使用BufferWriter如下:

public class class1{
...
void print()
     {
     System.out.println("The name "+outName()+" Tel: "+outNumber());
       try{
          PrintWriter printWriter=new PrintWriter(new BufferedWriter(new FileWriter("myfile.txt", true)));
          printWriter.println("The name "+outName()+" Tel: "+outNumber());
        }catch (IOException e){}
       }

    }     

但是我有另一個類和主要功能也有自己的打印功能

public class class2{
    ...
    void print()
         {
         System.out.println("The name "+outName()+" Tel: "+outNumber());
           try{
              PrintWriter printWriter=new PrintWriter(new BufferedWriter(new FileWriter("myfile.txt", true)));
              printWriter.println("The name "+outName()+" Tel: "+outNumber());
            }catch (IOException e){}
           }

        }  

public static void main(String[] args) throws IOException{

try{
    PrintWriter printWriter=new PrintWriter(new BufferedWriter(new FileWriter("myfile.txt", true)));
    ...
    printWriter.println("something");

printWriter.close();
    }catch(IOException e){ }

}

代碼通過編譯,但是只有main函數的輸出出現在輸出文件中。 請如何解決?

您的代碼存在三個(確定,使之成為四個,而不是五個)重大問題。

  1. class2你不close或刷新the你寫完后PrintWriter`。 這意味着數據將永遠不會寫到文件中。 這就是為什么您永遠看不到輸出的原因。

    這是明顯的錯誤。 但是其余的問題也很重要。 可以說更重要 ...所以請繼續閱讀。

  2. class2print()方法泄漏文件描述符(!)。 每次您調用它時,它將打開一個文件描述符,編寫內容……並將其放在地板上。 如果您反復調用print() ,則FileWriter構造函數將失敗。 需要關閉文件,而確保其始終發生的最干凈方法是編寫如下代碼:

     try (PrintWriter printWriter = new PrintWriter(new BufferedWriter( new FileWriter("myfile.txt", true)))) { printWriter.println(...); } 

    這是“嘗試使用資源” ...,它可以確保在范圍退出時將關閉資源( printWriter )。

  3. 您正在擠壓異常。

     try { PrintWriter printWriter - ... } catch (IOException e) { // SQUASH!!! } 

    這確實非常糟糕 基本上,您已經編寫了代碼來忽略異常。 假裝它從來沒有發生過……並丟棄了信息,說明為什么會發生。

    僅當您絕對確定只捕獲預期的異常並且完全忽略它們時,才應該擠壓異常。 在這里,不是。 如果在這里拋出IOException需要知道原因!

  4. 打開多個流以寫入同一文件是解決問題的方法。 流將不會同步,並且您可能會以意外的方式在輸出文件中看到輸出交錯。 如果輸出管道包括緩沖(就像您的緩沖一樣),則問題會更加嚴重。

  5. 您有嚴重的Java樣式問題:

    • 類名應始終以大寫字母開頭。 總是。 即使在示例代碼段中,也...

    • 代碼應一致縮進。 我建議使用SP字符而不是TAB字符,因為選項卡不能始終顯示。

    • 關於應該和不應該在何處放置空格和換行符有一些樣式規則。 例如,二進制運算符周圍應始終有空白。 查找Java樣式指南,閱讀並相應地格式化代碼。

    始終編​​寫您的代碼,以便>> other <<可以閱讀它。

這是因為您永遠不會關閉main()中的任何內容。 您還吞下了異常,因此您對自己隱藏了真相。 不要那樣做

但這是不好的做法。 您應該保持文件打開狀態,並使用相同的FileWriter,BufferedWriter,PrintWriter,並對它們進行同步訪問,以免獲得交錯數據。

總體來說不是一個好主意。

我認為您需要調用new class1().print()new class2().print() ,即您需要首先實例化實例。

另外,請記住在每個print()函數中關閉文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM