2017-08-20 57 views
-5
import java.io.File; 
import java.io.PrintWriter; 
public class PrintWriterExample { 


    public static void main(String[] args) throws Exception { 
      //Data to write on Console using PrintWriter 
     PrintWriter writer = new PrintWriter(System.out);  
     writer.write("Hello World");   
System.out.write(65); 
System.out.write(' '); 
System.out.flush(); 
System.out.close(); 

// writer.flush(); 
    //writer.close(); 

    } 
} 

Iam無法理解write()方法。它的描述說它將指定的字節寫入這個流。 '這個流'是什麼意思。它寫在哪裏?某種緩衝區? 將System.out作爲參數傳遞給PrintWriter類構造函數是什麼意思? 在這段代碼中,我的數據在哪裏緩衝?當我使用writer.write()和System.out.write()時,是否創建了一些臨時內存? 另外,當我試圖評論和取消註釋隨機刷新和關閉方法我得到的結果困惑我。在這個特殊的情況下,即使我刷新並關閉緩衝區,爲什麼沒有「Hello World」打印在屏幕上。如果你說緩衝區不同,那麼當我取消註釋writer.flush()和writer.close()時,我也會得到相同的結果。在Java中PrintWriter write()方法寫入數據

+0

您創建指向系統輸出流的打印作者。或標準化或簡單:控制檯。它就在你的代碼中。只需閱讀所有相關的javadoc。 – GhostCat

回答

1

System.outPrintStream,又名OutputStream,所以你打電話給PrintWriter(OutputStream out)的構造函數。

它相當於調用PrintWriter(Writer out)具有以下參數:

new BufferedWriter(new OutputStreamWriter(out)) 

BufferedWriter注入性能方面的原因。

我的數據在哪裏緩衝?

BufferedWriter

爲什麼犯規的「Hello World」獲得印刷

"Hello World"文本坐在那個緩衝區,因爲你永遠不沖水writer,它永遠不會被下游發送到System.out打印流。

通過System.out作爲PrintWriter類構造函數的參數是什麼意思?

這意味着任何寫入PrintWriter的文字都會被轉發到System.out。正如javadoc所示:此便利構造函數創建必需的中間OutputStreamWriter,它將使用默認字符編碼將字符轉換爲字節

當我取消註釋writer.flush()和writer.close()然後我也得到相同的結果。

那是因爲你已經關閉了System.out,所以它不會再接受任何輸出。 PrintWriter默默地忽略了您嘗試時引發的錯誤。正如javadoc所說:此類中的方法絕不會拋出I/O異常,儘管它的一些構造函數可能會。客戶可以通過調用checkError()來詢問是否發生了錯誤。


解決方案

調用close()會自動調用flush(),所以你不需要close()之前調用flush()

PrintWriter調用close()將自動調用close()System.out,所以你不需要那樣做。

刪除System.out.flush();,System.out.close();writer.flush();,只能撥打writer.close();

更重要的是,您應該一般不會關閉System.out,所以請致電writer.flush();,並將其保持打開狀態。

+0

該聲明是隱式調用的嗎?新的BufferedWriter(新的OutputStreamWriter(out)) –

+0

System.out.write(65);該行是否也創建一個新的緩衝區來存儲char 65? –

+0

@PranjalKanyal'PrintWriter(OutputStream out)'是一個方便的構造函數,它調用'PrintWriter(new BufferedWriter(new OutputStreamWriter(out)))''。繼續看看'PrintWriter'的源代碼以便自己查看(如果使用IDE,最簡單)。 ---'System.out'也被緩衝,出於同樣的原因(性能)。 – Andreas

相關問題