2017-08-09 95 views
1

我正在研究一個小程序,它需要我從一個文件中讀取一組參數,對其中的三個類執行一些操作(所有3個類繼承相同的父類)。每個操作之後,該方法應該打印一行在一個輸出文件中類似方法2 方法的方法1個 輸出3 1等如何在多個類中使用相同的printwriter(java)

的的輸出2的方法1個 輸出1的該

輸出1想法是所有3個類的所有方法都應該在同一個文件中打印,順序不重要。

我已經使用這個代碼在每個方法的末尾/ if塊

if/method { 
.... do something 
text ="output of something"; 
    try(PrintWriter out = new PrintWriter("outputfile.txt") ){ 
     out.println(text); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    }//end if/method 

的代碼確實寫的東西到該文件,但它始終會覆蓋前行。因此,例如,不是有12行「東西」,我只有1個。

我該如何解決這個問題?我懷疑這是因爲我每次都製作一個新的PrintWriter,並想過在其他地方聲明它並將其調用給每個類。這會起作用嗎?我怎麼去把它叫給每個班?

這是我第一次使用文件。謝謝。

+0

是的,問題是你創造的所有三個類的新PrintWriter。而不是做這個,你必須把它作爲參數傳遞。例如:編寫處理方法以接受PrintWriter作爲參數,然後在主方法中創建一個PrintWriter實例,然後將三個方法調用放入其try塊中。 –

+0

@BalázsNemes,如果寫操作不是併發和及時分離的(即每個類可以寫而不管其他三個類正在做什麼),爲每個類創建自己的打印作家實際上是很好的。 –

+0

@ M.Prokhorov好的..那麼我該如何避免覆蓋? –

回答

1

您用於創建PrintWriter的構造函數在內部使用FileOutputStream的新實例。

FileOutputStream有兩個一般寫型號:

  • 覆蓋(默認)
  • 追加

既然你沒有指定要使用的模式,你的作家將使用默認的。要告訴它你想要的模式,你將需要創建FileOutputStream正確的模式。例如,像這樣:

try(PrintWriter out = new PrintWriter(new FileOutputStream("outputfile.txt", true))) { 
// note the boolean parameter in FileOS constructor above. Its "true" value means "Append" 
    out.println(text); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 

有什麼可說的對每一類創建自己的PrintWriter還有:

  • 它複製的邏輯
  • 它(可能是不必要的)關係無論你類與輸出操作專門到一個文件(如果你想寫在HTTP上呢?)
  • 打開文件的操作通常不便宜,所以你失去了性能

我建議,而不是每個類創建自己的輸出設備,而不是它應該接受一個來自外部:

class MyClass { 
    public void outputTo(PrintWriter w) { 
    String text = ... 
    w.println(text); 
    } 
} 

and you use it like this: 

try (FileOutputStream fos = new FileOutputStream("filename", append); 
    PrintWriter w = new PrintWriter(fos)) { 
    new MyClass().outputTo(w); // first instance 
    new MyClass().outputTo(w); // second instance 
    //... etc. 
} 
+0

非常感謝。這真的有幫助! :) –

0

嘗試聲明PrintWriter作爲父類的靜態變量,並根據需要在子類中使用它。

+0

那麼,public static PrintWriter出來了嗎? –

+1

@DanielBoksan,這實際上是一個非常糟糕的主意,因爲沒有哪個類會知道什麼時候關閉作者,並且你會擁有一個很好的小資源泄漏。 –

相關問題