複製鏈接
請複製以下鏈接發送給好友

OutputStream

鎖定
OutputStream是計算機語言,作用是為“破壞器”類提供一個基礎類。
中文名
破壞器
外文名
OutputStream
分    類
計算機語言
作    用
為“破壞器”類提供一個基礎類

OutputStreamjava的OutputStream的類型

這一類別包括的類決定了我們的輸出往何處去:
一個字節數組(但沒有String;假定我們可用字節數組創建一個);
一個文件;或者一個“管道”。
除此以外,FilterOutputStream為“破壞器”類提供了一個基礎類,它將屬性或者有用的接口同輸出流連接起來。這將在以後討論。
表10.2 OutputStream的類型
ByteArray-OutputStream
Creates a buffer in memory. All the data that you send to the stream is placed in this buffer.
Optional initial size of the buffer.
To designate the destination of your data. Connect it to a FilterOutputStream object to provide a useful interface.
-
-
File-OutputStream
For sending information to a file.
A String representing the file name, or a File or FileDescriptor object.
To designate the destination of your data. Connect it to a FilterOutputStream object to provide a useful interface.
-
-
Piped-OutputStream
Any information you write to this automatically ends up as input for the associated PipedInput-Stream. Implements the “piping” concept.
PipedInputStream
To designate the destination of your data for multithreading. Connect it to a FilterOutputStream object to provide a useful interface.
-
-
Filter-OutputStream
Abstract class which is an interface for decorators that provide useful functionality to the other OutputStream classes. See Table
10-4.
See Table 10-4.
See Table 10-4.
-
-
類 功能 構建器參數/如何使用
ByteArrayOutputStream 在內存中創建一個緩衝區。我們發送給流的所有數據都會置入這個緩衝區。 可選緩衝區的初始大小/用於指出數據的目的地。若將其同FilterOutputStream對象連接到一起,可提供一個有用的接口
FileOutputStream 將信息發給一個文件 用一個String代表文件名,或選用一個File或FileDescriptor對象/用於指出數據的目的地。
PipedOutputStream 我們寫給它的任何信息都會自動成為相關的PipedInputStream的輸出。實現了“管道化”的概念 PipedInputStream/為多線程處理指出自己數據的目的地/將其同FilterOutputStream對象連接到一起,便可提供一個有用的接口
FilterOutputStream 對作為破壞器接口使用的類進行抽象處理;那個破壞器為其他OutputStream類提供了有用的功能。參見表10.4

OutputStreamOutputStream的使用方法

根據寫數據的方式不同,OutputStream主要分成兩類;一類是寫給人看的,一類是供DataInputStream用的。雖然RandomAccessFile的數據格式同DataInputStream和DataOutputStream的相同,但它不屬於OutputStream的。

OutputStream存儲和恢復數據

PrintWriter會對數據進行格式化,這樣人就能讀懂了。但是如果數據輸出之後,還要恢復出來供其它流用,那你就必須用DataOutputStream來寫數據,再用DataInputStream來讀數據了。當然,它們可以是任何流,不過我們這裏用的是一個經緩衝的文件。DataOutputStream和DataInputStream是面向byte的,因此這些流必須都是InputStream和OutputStream。
如果數據是用DataOutputStream寫的,那麼不管在哪個平台上,DataInputStream都能準確地把它還原出來。這一點真是太有用了,因為沒人知道誰在為平台專屬的數據操心。如果你在兩個平台上都用Java,那這個問題就根本不存在了 。
用DataOutputStream寫String的時候,要想確保將來能用DataInputStream恢復出來,唯一的辦法就是使用UTF-8編碼,也就是像例程第5部分那樣,用writeUTF( )和readUTF( )。UTF-8是Unicode的一種變形。Unicode用兩個字節來表示一個字符。但是,如果你處理的全部,或主要是ASCII字符(只有7位),那麼無論從存儲空間還是從帶寬上看,就都顯得太浪費了,所以UTF-8 用一個字節表示ASCII字符,用兩或三個字節表示非ASCII的字符。此外,字符串的長度信息存在(字符串)的頭兩個字節裏。writeUTF( )和readUTF( )用的是Java自己的UTF-8版本(JDK文檔裏有關於這個字符集的完整講解,就在這兩個方法的文檔裏),所以如果你要用一個Java程序讀取writeUTF( )寫的字符串的話,就必須進行一些特殊處理了。
有了writeUTF( )和readUTF( ),你就能放心地把String和其它數據混在一起交給DataOutputStream了,因為你知道String是以Unicode的形式存儲的,而且可以很方便地用DataOutputStream恢復出來。
writeDouble( )會往流裏寫double,而它"影子"readDouble( )則負責把它恢復出來(其它數據也有類似的讀寫方法)。但是要想讓讀取方法能正常工作,你就必須知道流的各個位置上都放了些什麼數據。因為你完全可以把double讀成byte,char,或其它什麼東西。所以要麼以固定的格式寫文件,要麼在文件裏提供額外的解釋信息,然後一邊讀數據一邊找數據。先提一下,對於複雜數據的存儲和恢復,對象的序列化可能會比較簡單。

OutputStream讀寫隨機文件

正如我們前面所講的,如果不算它實現了DataInput和DataOutput接口,RandomAccessFile幾乎是完全獨立於其它I/O類庫之外的,所以它不能與InputStream和OutputStream合起來用。雖然把ByteArrayInputStream當作"隨機存取的元素(random-access element)"是一件很合情合理的事,但你只能用RandomAccessFile來打開文件。而且,你只能假定RandomAccessFile已經做過緩衝了,因為即便沒做你也無能為力。
構造函數的第二個參數的意思是:是以只讀("r") 還是讀寫("rw")方式打開RandomAccessFile
RandomAccessFile的用法就像是DataInputStream和DataOutputStream的結合(因為它們的接口是等效的)。此外,你還能用seek( )在文件裏上下移動,並進行修改。
隨着JDK 1.4的new I/O的問世,你該考慮一下是不是用"內存映射文件(memory-mapped file)"來代替RandomAccessFile了。
在JAVA中,OutputStream是所有字節輸出流的父類。