2010-11-01 388 views
96

我有幾個輸出監聽器正在實現OutputStream。 它可以是PrintStream寫入標準輸出或文件,也可以寫入內存或任何其他輸出目標;因此,我在該方法中將OutputStream指定爲(an)參數。將字符串寫入輸出流

現在,我收到了字符串。在這裏寫入流的最佳方式是什麼?

我應該只使用Writer.write(message.getBytes())嗎?我可以給它的字節,但如果目標流是一個字符流,那麼它會自動轉換?

我需要在這裏使用一些網橋流嗎?

+1

我不知道,但是這聽起來像你試圖在這裏重新發明輪子,你有沒有看過J? ava Base API以及Commons IO API? – posdef 2010-11-01 12:57:05

回答

118

流(InputStreamOutputStream)轉讓二進制數據。如果要將字符串寫入流中,則必須先將其轉換爲字節,或換句話說將其編碼爲。您可以使用String.getBytes(Charset)方法手動執行此操作(如您所建議的那樣),但應避免使用String.getBytes()方法,因爲它使用JVM的默認編碼,無法以便攜方式對其進行可靠預測。

爲字符數據寫入流的常用方法,不過,是包裹在一個Writer流,(通常是一個PrintWriter),執行轉換爲你當調用其write(String)(或print(String))方法。 InputStreams的相應包裝是Reader

PrintStream是一個特殊的OutputStream實現,它還包含自動編碼字符串(它在內部使用編寫器)的方法。但它仍然是一個流。無論是否爲PrintStream或其他流實現,您都可以安全地使用作家打包流。沒有雙重編碼的危險。 PrintWriter的與爲OutputStream

實施例:

try (PrintWriter p = new PrintWriter(new FileOutputStream("output-text.txt", true))) { 
    p.println("Hello"); 
} catch (FileNotFoundException e1) { 
    e1.printStackTrace(); 
} 
11

PrintWriter包裝您的OutputStream並使用該類的打印方法。他們接受一個字符串併爲你做這項工作。

29

您可以創建一個在你的OutputStream一個PrintStream包裝,然後就調用它的打印(串):

final OutputStream os = new FileOutputStream("/tmp/out"); 
final PrintStream printStream = new PrintStream(os); 
printStream.print("String"); 
printStream.close(); 
+2

PrintStream使用什麼字符集轉換爲字節? – 2016-01-31 15:56:59

73

的OutputStream寫入字節,字符串提供了字符。您需要定義字符集編碼字符串爲byte []:

outputStream.write(string.getBytes(Charset.forName("UTF-8"))); 

更改UTF-8到您選擇的字符集。

+0

附加下面一行。 'ByteArrayOutputStream outputStream = new ByteArrayOutputStream();' – 2017-12-27 09:22:25

11

By design它做這種方式:

OutputStream out = ...; 
try (Writer w = new OutputStreamWriter(out, "UTF-8")) { 
    w.write("Hello, World!"); 
} // or w.close(); //close will auto-flush 
+1

請注意,'w.close()'也會關閉'out'。 – 2018-01-11 16:32:18