Stream vs WriterReader API

Streams 提供對二進位制內容的最直接訪問,因此任何 InputStream / OutputStream 實現始終在 ints 和 bytes 上執行。

// Read a single byte from the stream
int b = inputStream.read();
if (b >= 0) { // A negative value represents the end of the stream, normal values are in the range 0 - 255
    // Write the byte to another stream
    outputStream.write(b);
}

// Read a chunk
byte[] data = new byte[1024];
int nBytesRead = inputStream.read(data);
if (nBytesRead >= 0) { // A negative value represents end of stream
    // Write the chunk to another stream
    outputStream.write(data, 0, nBytesRead);
}

有一些例外,可能最值得注意的是 PrintStream 增加了方便地列印各種資料值表示的能力。這允許使用 System.out 作為二進位制 InputStream 並使用諸如 System.out.println() 之類的方法作為文字輸出。

此外,一些流實現用作更高階內容的介面,例如 Java 物件(請參閱序列化)或本機型別,例如 DataOutputStream / DataInputStream

通過 WriterReader 類,Java 還為顯式字元流提供 API。雖然大多數應用程式都將這些實現基於流,但字元流 API 不會公開任何二進位制內容的方法。

// This example uses the platform's default charset, see below
// for a better implementation.

Writer writer = new OutputStreamWriter(System.out);
writer.write("Hello world!");

Reader reader = new InputStreamReader(System.in);
char singleCharacter = reader.read();

每當需要將字元編碼為二進位制資料時(例如,當使用 InputStreamWriter / OutputStreamWriter 類時),如果你不想依賴於平臺的預設字符集,則應指定字符集。如有疑問,請使用與 Unicode 相容的編碼,例如所有 Java 平臺都支援的 UTF-8。因此,你應該遠離像 FileWriterFileReader 這樣的類,因為那些總是使用預設的平臺字符集。使用字元流訪問檔案的更好方法是:

Charset myCharset = StandardCharsets.UTF_8;

Writer writer = new OutputStreamWriter( new FileOutputStream("test.txt"), myCharset );
writer.write('Ä');
writer.flush();
writer.close();

Reader reader = new InputStreamReader( new FileInputStream("test.txt"), myCharset );
char someUnicodeCharacter = reader.read();
reader.close();

最常用的 Reader 之一是 BufferedReader,它提供了一種從另一個讀取器讀取整行文字的方法,並且可能是逐行讀取字元流的最簡單方法:

// Read from baseReader, one line at a time
BufferedReader reader = new BufferedReader( baseReader );
String line;
while((line = reader.readLine()) != null) {
  // Remember: System.out is a stream, not a writer!
  System.out.println(line);
}