轉(zhuǎn)自: http://www.blogjava.net/cherishchen/archive/2007/07/10/129313.html
?
?
所有類(lèi)的根接口:InputStream/OutputStream
一、底層的還是裝飾的
1、底層的直接與文件系統(tǒng)或者硬件打交道的類(lèi)(充當(dāng)數(shù)據(jù)源的類(lèi)):
包括InputStream和OutPutStream兩大類(lèi),分別用于輸入和輸出,數(shù)據(jù)源可以是bytes array,String對(duì)象,file文件,stream序列等:
- FileInputStream/FileOutputStream
- ByteArrayInputStream/ByteArrayOutputStream
- StringBufferInputStream/StringBufferOutputStream
等,具體參看下面的java io類(lèi)圖
2、充當(dāng)裝飾功能的io類(lèi),通過(guò)裝飾底層的類(lèi)來(lái)實(shí)現(xiàn)更高級(jí)的功能,繼承自FilterOutputStream/FilterOutputStream,包括:
- BufferedOutputStream/BufferedInputStream
- Datainputstream/Dataoutputstream
等,具體參看下面的java io類(lèi)圖
使用FilterOutputStream/FilterOutputStream時(shí),首先創(chuàng)建一個(gè)數(shù)據(jù)源IO,然后根據(jù)需要的功能創(chuàng)建裝飾類(lèi)io,其構(gòu)造函數(shù)的參數(shù)為已創(chuàng)建的數(shù)據(jù)源io。
二、面向字符還是面向字節(jié)
同時(shí),java的IO體系又可以分成:inputStream/outputStream和reader/writer兩類(lèi):
(1) Reader/Writer是面向Unicode字符的(Characters)
(2) InputStream/OutputStream是直接面向字節(jié)的(bytes)。
Reader/Writer繼承體系之所以存在,最重要的原因是為了國(guó)際化,舊式I/O stream 的繼承體系僅僅支持8-bit byte stream,而且無(wú)法處理16-bit unicode 字符。由于unicode被用于字符國(guó)際化,所以加入Reader/Writer以便在所有的io動(dòng)作上提供對(duì)unicode的支持。
幾乎所有的java io stream classes都有相應(yīng)的Reader和Writer來(lái)提供對(duì)unicode的支持,但是在某些場(chǎng)合,使用byte-oriented InputStream和OutPutStream才是正取的方法,最合理的方式是盡可能先嘗試使用Read和Writer,其次才使用byte-oriented庫(kù)。
三、從InputStream/OutPutStream到Reader/Writer的轉(zhuǎn)換
InputStreamReader和OutputStreamWriter,可以把一個(gè)以字節(jié)為導(dǎo)向的stream轉(zhuǎn)換成一個(gè)以字符為導(dǎo)向的stream。
Java 1.0 class(byte oriented)????? Java 1.1 class(unicode character oriented)
裝飾前的行為
InputStream?????????????????????????????????????????????????????? Reader? 轉(zhuǎn)換器:InputStreamReader
OutputStreamReader????????????????????????????????????????? Writer? 轉(zhuǎn)換器: OutputStreamWriter
FileInputSream?????????????????????????????????????????????????? FileOutputStream
FileReader????????????????????????????????????????????????????????? FileWriter
StringBufferInputStream??????????????????????????????????? StringReader/ StringWriter????????????????????????????????????
ByteArrayInputStream???????????????????????????????????????? ByteArrayOutputStream?????????????????
CharArrayReader??????????????????????????????????????????????? CharArrayWriter
裝飾后的行為
BufferedInputStream????????????????????????????????????????? BufferedOutputStream
BufferedReader?????????????????????????????????????????????????? BufferedWriter
PrintStream???????????????????????????????????????????????????????? PrintWriter
四、示例
DataInputStream 和DataOutputStream
Java 中除了二進(jìn)制文件和使用文本文件外還有基于Data的數(shù)據(jù)操作,這里的Data指的是Java的基本數(shù)據(jù)類(lèi)型和String。基本數(shù)據(jù)類(lèi)型包括byte、int、char、long、float、double、boolean和short。
例子:
protected void connect (Socket socket)
throws IOException, SocketException
{
this.socket = socket;
applyTimeout();
serverIn = new DataInputStream (
new BufferedInputStream (socket.getInputStream ())
);
serverOut = new DataOutputStream(
new BufferedOutputStream(socket.getOutputStream(), 2048)
);
usable = true;
cnt[CONNECT]++;
setChanged();
notifyObservers();
}
在DataInputStream和DataOutputStream兩個(gè)類(lèi)中的方法都很簡(jiǎn)單,基本結(jié)構(gòu)為readXXXX()和writeXXXX()其中XXXX代表基本數(shù)據(jù)類(lèi)型或者String。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
