Stream vs WriterReader API
Streams 提供對二進位制內容的最直接訪問,因此任何 InputStream
/ OutputStream
實現始終在 int
s 和 byte
s 上執行。
// 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
。
通過 Writer
和 Reader
類,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。因此,你應該遠離像 FileWriter
和 FileReader
這樣的類,因為那些總是使用預設的平臺字符集。使用字元流訪問檔案的更好方法是:
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);
}