Java IO: 其他位元組流(上)
作者: Jakob Jenkov 譯者: 李璟([email protected])
本小節會簡要概括Java IO中的PushbackInputStream,SequenceInputStream和PrintStream。其中,最常用的是PrintStream,System.out和System.err都是PrintStream型別的變數,請檢視Java IO: System.in, System.out, System.err瀏覽更多關於System.out和System.err的資訊。
PushbackInputStream
PushbackInputStream用於解析InputStream內的資料。有時候你需要提前知道接下來將要讀取到的位元組內容,才能判斷用何種方式進行資料解析。PushBackInputStream允許你這麼做,你可以把讀取到的位元組重新推回到InputStream中,以便再次通過read()讀取。程式碼如下:
PushbackInputStream input = new PushbackInputStream(new FileInputStream("c:\\data\\input.txt")); int data = input.read(); input.unread(data);
可以通過PushBackInputStream的建構函式設定推回緩衝區的大小,程式碼如下:
PushbackInputStream input = new PushbackInputStream(new FileInputStream("c:\\data\\input.txt"), 8);
這個例子設定了8個位元組的緩衝區,意味著你最多可以重新讀取8個位元組的資料。
SequenceInputStream
SequenceInputStream把一個或者多個InputStream整合起來,形成一個邏輯連貫的輸入流。當讀取SequenceInputStream時,會先從第一個輸入流中讀取,完成之後再從第二個輸入流讀取,以此推類。程式碼如下:
InputStream input1 = new FileInputStream("c:\\data\\file1.txt"); InputStream input2 = new FileInputStream("c:\\data\\file2.txt"); InputStream combined = new SequenceInputStream(input1, input2);
通過SequenceInputStream,例子中的2個InputStream使用起來就如同只有一個InputStream一樣(譯者注:SequenceInputStream的read()方法會在讀取到當前流末尾時,關閉流,並把當前流指向邏輯鏈中的下一個流,最後返回新的當前流的read()值)。
PrintStream
PrintStream允許你把格式化資料寫入到底層OutputStream中。比如,寫入格式化成文字的int,long以及其他原始資料型別到輸出流中,而非它們的位元組資料。程式碼如下:
PrintStream output = new PrintStream(outputStream); output.print(true); output.print((int) 123); output.print((float) 123.456); output.printf(Locale.UK, "Text + data: %1$", 123); output.close();
PrintStream包含2個強大的函式,分別是format()和printf()(這兩個函式幾乎做了一樣的事情,但是C程式設計師會更熟悉printf())。
譯者注:其中一個printf()函式實現如下:
public PrintStream printf(String format, Object ... args) { return format(format, args); }