簡體   English   中英

將字符串寫入輸出流

[英]Write string to output stream

我有幾個正在實現OutputStream輸出偵聽器。 它可以是寫入標准輸出或文件的PrintStream ,也可以是寫入內存或任何其他輸出目的地; 因此,我在方法中將OutputStream指定為 (an) 參數。

現在,我收到了String 在這里寫入流的最佳方式是什么?

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

我需要在這里使用一些橋接流嗎?

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

但是,將字符數據寫入流的常用方法是將流包裝在Writer (通常是PrintWriter )中,當您調用它的write(String) (或print(String) )方法時,它會為您進行轉換. InputStreams 的相應包裝器是Reader

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

帶有 OutputStream 的 PrintWriter 示例:

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

OutputStream 寫入字節,String 提供字符。 您需要定義 Charset 將字符串編碼為 byte[]:

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

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

您可以創建一個環繞輸出流的 PrintStream,然后將其稱為 print(String):

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

按照設計,它是這樣完成的:

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

PrintWriter包裝您的 OutputStream 並使用該類上的打印方法。 他們接受一個字符串並為您完成工作。

您可以使用Apache Commons IO

try (OutputStream outputStream = ...) {
    IOUtils.write("data", outputStream, "UTF-8");
}

暫無
暫無

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

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