java流类图结构_java学习之IO流(学习之旅,一)
個(gè)人在學(xué)習(xí)IO流的時(shí)候看到如下所示java 流類圖結(jié)構(gòu)的時(shí)候,我的感想是,這么多··處于蒙的狀態(tài)。
Java流類圖結(jié)構(gòu)
這么多,沒有分類不好學(xué),那我們就慢慢一口一口的吃,這樣每天學(xué)習(xí)一點(diǎn)就好了,其實(shí)很多類并不是常用的。
縷清思路很重要的,那么我轉(zhuǎn)一篇百度的文檔,寫的思路很清晰。
第一步,首先,明確IO流中有兩個(gè)主要的體系,即字節(jié)輸入流(InputStream)、輸出流(OutputStream)和字符輸入流(Reader)、輸出流(Writer)。其次,明確數(shù)據(jù)的來源和數(shù)據(jù)將要到達(dá)的目的地。
為啥要有字節(jié)流和字符流呢?多麻煩?
自然是有原因的:字節(jié)流能處理所有類型的數(shù)據(jù)(如圖片、avi等),而字符流只能處理字符類型的數(shù)據(jù)。
字節(jié)流:一次讀入或讀出是8位二進(jìn)制。? ? ? 字符流:一次讀入或讀出是16位二進(jìn)制。
第二步,明確將要操作的數(shù)據(jù)是否是純文本數(shù)據(jù)。如果數(shù)據(jù)源是純文本數(shù)據(jù)選Reader;數(shù)據(jù)源不是純文本數(shù)據(jù)選擇InputStream。如果數(shù)據(jù)目的地是純文本數(shù)據(jù)就選擇Writer;如果不是則選擇OutputStream。
第三步,明確具體的設(shè)備。即數(shù)據(jù)源是從哪個(gè)設(shè)備來的:是硬盤就加File;是鍵盤用System.in(是一個(gè)InputStream對(duì)象);是內(nèi)存用數(shù)組;是網(wǎng)絡(luò)用Socket流。同樣目的是哪個(gè)設(shè)備:是硬盤就加File;是鍵盤用System.out(是一個(gè)OutoutStream對(duì)象);是內(nèi)存用數(shù)組;是網(wǎng)絡(luò)用Socket流。
第四步,明確是否還需要其他額外功能呢,例如①是否需要較高的效率,即是否需要使用緩沖區(qū),是就加上Buffered;②是否需要轉(zhuǎn)換,是,就使用轉(zhuǎn)換流,InputStreamReader 和OutputStreamWriter。
下面給出例子,具體的用法
上面百度文檔已經(jīng)介紹的很清楚了,不過我還想更加詳細(xì)的了解一下輸入流和輸出流。在這里只介紹比較常用的方法,因?yàn)閷W(xué)習(xí)需要慢慢來·····
輸入字節(jié)流 InputStream
InputStream? ? ? 是所有的輸入字節(jié)流的父類,它是一個(gè)抽象類。(做什么用的呢?是個(gè)抽象類,不是接口,后期再研究)
下面我要考慮了,其實(shí)文件的輸出輸入是比較容易混的。那么我們?cè)趺磪^(qū)分呢?
這樣,不管是輸入還是輸出,都是真對(duì)內(nèi)存來說的,什么意思呢?
解釋一下:如果我們要上傳一個(gè)文件,有三個(gè)步驟。第一,讀取本地文件,就是先把硬盤上面的文件讀取到內(nèi)存中,那么真對(duì)內(nèi)存來說就是用輸入流(inputStream);第二,再把內(nèi)存中的文件輸出(outStream),真對(duì)內(nèi)存來說就是從內(nèi)存輸出到服務(wù)器的硬盤上。
ByteArrayInputStream 、StringBufferInputStream、FileInputStream?是三種基本的介質(zhì)流,它們分別從Byte 數(shù)組、StringBuffer、和本地文件中讀取數(shù)據(jù)。
其他兩種沒用過,?只就是??FileInputStream ,文件的上傳和下載用的都是這種流。
輸出字節(jié)流 OutputStream
OutputStream??是所有的輸出字節(jié)流的父類,它是一個(gè)抽象類。(和上面對(duì)應(yīng)的==不懂,后期研究==)
這次寫文件下載用的就是這個(gè)父類。下面給出代碼
//創(chuàng)建輸出流
OutputStream out =response.getOutputStream();//創(chuàng)建數(shù)組
byte buffer[] = new byte[1024];int len = 0;//循環(huán)將輸入流中的內(nèi)容讀取到緩沖區(qū)當(dāng)中
while((len=in.read(buffer))>0){//輸出緩沖區(qū)的內(nèi)容到瀏覽器,實(shí)現(xiàn)文件下載
out.write(buffer, 0, len);
}
用FileOutputStream 應(yīng)該也是可以的吧,不過這就要指定具體的那個(gè)路徑進(jìn)行文件寫出,也就是往硬盤寫入。
在此,我有個(gè)疑問,byte buffer[] 是否是緩沖區(qū)?
答案;不是緩沖流,不確定緩沖區(qū)做什么用的,后期再研究。
緩沖流:有四個(gè),當(dāng)然是字節(jié)緩沖輸入流BufferedInputStrean、字節(jié)緩沖輸出流OutputStreamWriter、 和字符的?BufferedReader、?BufferedWriter?增加緩沖功能,避免頻繁讀寫硬盤。
緩沖流大小通常是根據(jù)文件大小來進(jìn)行匹配的,如果不進(jìn)行設(shè)置有個(gè)默認(rèn)值
今天就到這吧
總結(jié)
以上是生活随笔為你收集整理的java流类图结构_java学习之IO流(学习之旅,一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FTP 客户端C实现
- 下一篇: C#如何实现 ASCII码与字母的互相转