欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的stream流的概念解析及實(shí)際運(yùn)用總結(jié)

 更新時(shí)間:2016年06月26日 15:44:42   作者:pizzq  
流是指?jìng)鬏敃r(shí)的數(shù)據(jù),Java為流準(zhǔn)備了很多內(nèi)置類,尤其是IO輸入輸出流非常常用,這里我們來(lái)看一下Java中的stream流的概念解析及實(shí)際運(yùn)用總結(jié)

流是字節(jié)序列的抽象概念。
文件是數(shù)據(jù)的靜態(tài)存儲(chǔ)形式,而流是指數(shù)據(jù)傳輸時(shí)的形態(tài)。
流類分為兩個(gè)大類:節(jié)點(diǎn)流類和過(guò)濾流類(也叫處理流類)。
程序用于直接操作目標(biāo)設(shè)備所對(duì)應(yīng)的類叫節(jié)點(diǎn)流類,程序也可以通過(guò)一個(gè)間接流類去調(diào)用節(jié)點(diǎn)流類,以達(dá)到更加靈活方便地讀取各種類型的數(shù)據(jù),這個(gè)間接流類就是過(guò)濾流類(也叫處理流類),或者稱為包裝類。
包裝類的調(diào)用過(guò)程如下圖:

2016626153726182.gif (524×112)

流分類的關(guān)系
不管流的分類是多么的豐富和復(fù)雜,其根源來(lái)自于四個(gè)基本的類。這個(gè)四個(gè)類的關(guān)系如下:

字節(jié)流 字符流
輸入流 InputStream Reader
輸出流 OutputStream Writer

Java內(nèi)用 Unicode 編碼存儲(chǔ)字符,字符流處理類負(fù)責(zé)將外部的其他編碼的字符流和java內(nèi) Unicode 字符流之間的轉(zhuǎn)換。而類InputStreamReader 和OutputStreamWriter處理字符流和字節(jié)流的轉(zhuǎn)換。字符流(一次可以處理一個(gè)緩沖區(qū))一次操作比字節(jié)流(一次一個(gè)字節(jié))效率高。

InputStream

2016626153854884.gif (462×199)

由于InputStream和OutputStream是abstact類,所以它們還不能表明具體對(duì)應(yīng)哪種IO設(shè)備。它們下面有許多子類,包括網(wǎng)絡(luò)、管道、內(nèi)存、文件等具體的IO設(shè)備,實(shí)際程序中使用的它們的各種子類對(duì)象。
注:我們將節(jié)點(diǎn)流類所對(duì)應(yīng)的IO源和目標(biāo)稱為流節(jié)點(diǎn)(Node)。
注意:將A文件的內(nèi)容寫入B文件,程序?qū)文件的操作所用的是輸出類還是輸入類這個(gè)問題。輸入輸出類是相對(duì)程序而言的,而不是代表文件的,所以我們應(yīng)該創(chuàng)建一個(gè)輸入類來(lái)完成對(duì)A文件的操作,創(chuàng)建一個(gè)輸出類來(lái)完成對(duì)B文件的操作。

OutputStream

2016626153922575.gif (458×142)

以字符為導(dǎo)向的 stream Reader/Writer
以 Unicode 字符為導(dǎo)向的 stream ,表示以 Unicode 字符為單位從 stream 中讀取或往 stream 中寫入信息。同樣,Reader/Writer也為abstact類。

Reader
2016626153945333.gif (462×169)

Writer

2016626154006667.gif (465×222)

IO程序代碼的復(fù)用:
平時(shí)寫代碼用-1來(lái)作為鍵盤輸入的結(jié)束,在寫的函數(shù)中不直接使用System.in,只是在調(diào)用該函數(shù)時(shí),將System.in作為參數(shù)傳遞進(jìn)去,這樣,我們以后要從某個(gè)文件中讀取數(shù)據(jù),來(lái)代替手工鍵盤輸入時(shí),我們可以直接使用這個(gè)函數(shù),程序就不用做太多的修改了,達(dá)到以不變應(yīng)萬(wàn)變的效果。

字節(jié)流和字符流的相互轉(zhuǎn)換
InputStreamReader和OutputStreamReader:把一個(gè)以字節(jié)為導(dǎo)向的stream轉(zhuǎn)換成一個(gè)以字符為導(dǎo)向的stream。
InputStreamReader類是從字節(jié)流到字符流的橋梁:它讀入字節(jié),并根據(jù)指定的編碼方式,將之轉(zhuǎn)換為字符流。
使用的編碼方式可能由名稱指定,或平臺(tái)可接受的缺省編碼方式。
InputStreamReader的read()方法之一的每次調(diào)用,可能促使從基本字節(jié)輸入流中讀取一個(gè)或多個(gè)字節(jié)。
為了達(dá)到更高效率,考慮用BufferedReader封裝InputStreamReader,

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

Java流使用的一點(diǎn)總結(jié)
最經(jīng)工作中碰到不少Java流的使用,總結(jié)如下:
1. 生成Zip格式,遇到的是要在一個(gè)Servlet中生成Zip文件,輸出到web 客戶端,直接下載。

response.setContentType("application/zip"); 
 response.addHeader("Content-Disposition", "attachment;filename=/"xxx.zip/""); 
 ZipOutputStream out = new ZipOutputStream(response.getOutputStream()) 
  
 for() 
 {  
  ZipEntry entry = new ZipEntry("aa" + i ".dat"); 
  out.putNewEntry(entry); 
  bytes[] bt = s.getBytes(); 
  out.writeBytes(bt, 0, bt.length()); 
  out.closeEntry(); 
 } 
 out.flush(); 
 out.close(); 

ZipOutputStream 繼承自 java.io.FilterOutputStream. 因此真正的寫操作是通過(guò)參數(shù)OutputStream out去寫的。
 其 void write(byte[] b, int off, int len) 最終調(diào)用了 out.write(b, off, len);

如果要生成一個(gè)zip文件,構(gòu)造時(shí)就這樣寫 new ZipOutputStream(new FileOutputStream(path));

2. 類似的寫XML.
 

 XMLWriter writer = new XMLWriter(new FileOutputStream(path), formater)

writer.write(doc).道理和上面類似
3. 寫文本文件,追加。   

PrintStream ps = new PrintStream(new FileOutputStream(path, true), "utf-8")

ps.println(s); // 能寫boolean、int等各種類型。

PrintSteam同樣繼承自FilterOutputStream
其內(nèi)部使用一個(gè)OutputStreamWriter的對(duì)象textOut來(lái)寫。例如write(String s)最終調(diào)用到textOut.write(s);
    
這里涉及到編碼的問題。其參數(shù)里的"utf-8"最終傳遞到OutputStream。
    
OutputStream是一個(gè)字符流和字節(jié)流之間的橋梁。
 因此其提供了write(char[] cbuf, int off, int len) 和 write(String str, int off, int len) 用來(lái)寫字符和字符串。
OutputStream內(nèi)部又通過(guò)一個(gè)StreamEncoder對(duì)象來(lái)序列化字符和字符串。
4. 寫出到socket。
 DataOutputStream out = new DataOutputStream(socket.getOutputStream());
 out.writeBytes(bt);
 out.writeBoolean(boolean v) ; 

DataOutputStream同樣是一個(gè)自FilterOutputStream.

5. 從文本中讀取

 BufferedReader reader = new BufferedReader(new FileReader(path));
 reader.readLine();

    BufferedReader的模式和上面的Filter模式一樣,其內(nèi)部存儲(chǔ)一個(gè)Reader對(duì)象為參數(shù)傳進(jìn)來(lái)并用來(lái)實(shí)際讀取的對(duì)象。
    BufferedReader對(duì)應(yīng)java 1.0的類就是BufferedInputStream,是一個(gè)FilterInputStream。

6. 從Socket中讀取

 BufferedInputStream is = new BufferedInputStream(socket.getInputStream());
 is.read(bt, 0, bt.length());


總結(jié):
基類Stream系列是InputStream和OutputStream,他們是抽象類,要求的方法只有(以O(shè)utput為例)

void write(int b) throws IOException;
void write(byte b[]) throws IOException
void write(byte b[], int off, int len)

其最基本的只是字節(jié)操作。第1個(gè)方法看似寫一個(gè)整數(shù),其實(shí)只寫一個(gè)字節(jié)(最低八個(gè)bit)。其子類分兩個(gè)系列,一個(gè)是直接操作輸出設(shè)備的,我們上面碰到的有文件(FileOutputStream)和Servlet輸出(ServletOutputStream)。其他常用的還有一個(gè) ByteArrayOutputStream,是直接在內(nèi)存里操作的。
再就是FilterOutputStream系列了,都是接收一個(gè)OutputStream對(duì)象座位參數(shù),真正的寫操作通過(guò)該對(duì)象去完成。例如ZipOutputStream,其本身只負(fù)責(zé)生成壓縮格式的數(shù)據(jù),至于這些數(shù)據(jù)是寫到文件、內(nèi)存、還是servletResponse,由輸入的參數(shù)確定。這就是裝飾器模式。

Filter系列常用的有PrintStream(提供了print,println,write(boolean[int, char, string])各種操作,最終利用out.write方法以寫字節(jié)的方式寫進(jìn)去。
還有DataOutputStream,其提供了writeByte/writeBoolean/writeDouble/writeLong/wiretUTF等方法。
還有就是socket/zip等不常用的。

Java的流很方便也很復(fù)雜。復(fù)雜就復(fù)雜在實(shí)現(xiàn)一個(gè)功能往往需要多個(gè)類,而且有多種組合的辦法。尚需繼續(xù)在實(shí)踐中總結(jié)。  

相關(guān)文章

  • Spring運(yùn)行時(shí)手動(dòng)注入bean的方法實(shí)例

    Spring運(yùn)行時(shí)手動(dòng)注入bean的方法實(shí)例

    spring給我們提供了IOC服務(wù),讓我們可以用注解的方式,方便的使用bean的相互引用,下面這篇文章主要給大家介紹了關(guān)于Spring運(yùn)行時(shí)手動(dòng)注入bean的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • Java中Arraylist動(dòng)態(tài)擴(kuò)容方法詳解

    Java中Arraylist動(dòng)態(tài)擴(kuò)容方法詳解

    ArrayList的列表對(duì)象實(shí)質(zhì)上是存儲(chǔ)在一個(gè)引用型數(shù)組里的,下面這篇文章主要給大家介紹了關(guān)于Java中Arraylist動(dòng)態(tài)擴(kuò)容方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • SpringBoot集成Quartz實(shí)現(xiàn)持久化定時(shí)接口調(diào)用任務(wù)

    SpringBoot集成Quartz實(shí)現(xiàn)持久化定時(shí)接口調(diào)用任務(wù)

    Quartz是功能強(qiáng)大的開源作業(yè)調(diào)度庫(kù),幾乎可以集成到任何?Java?應(yīng)用程序中,從最小的獨(dú)立應(yīng)用程序到最大的電子商務(wù)系統(tǒng),本文將通過(guò)代碼示例給大家介紹SpringBoot集成Quartz實(shí)現(xiàn)持久化定時(shí)接口調(diào)用任務(wù),需要的朋友可以參考下
    2023-07-07
  • Java spring的三種注入方式詳解流程

    Java spring的三種注入方式詳解流程

    Spring框架由Rod Johnson開發(fā),2004年發(fā)布了Spring框架的第一版。Spring是一個(gè)從實(shí)際開發(fā)中抽取出來(lái)的框架,因此它完成了大量開發(fā)中的通用步驟,留給開發(fā)者的僅僅是與特定應(yīng)用相關(guān)的部分,從而大大提高了企業(yè)應(yīng)用的開發(fā)效率
    2021-10-10
  • Java RabbitMQ的三種Exchange模式

    Java RabbitMQ的三種Exchange模式

    這篇文章主要介紹了Java RabbitMQ的三種Exchange模式,分別為Direct模式、Fanout模式、Topic模式,Rabbit的Direct Exchange模式是指消息發(fā)送導(dǎo)RouteKey中指定的Queue,Direct模式可以使用Rabbit自帶的Exchange
    2022-08-08
  • java發(fā)送郵件示例講解

    java發(fā)送郵件示例講解

    這篇文章主要為大家詳細(xì)介紹了java發(fā)送郵件示例的全過(guò)程,溫習(xí)郵件協(xié)議,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • jmeter基礎(chǔ)邏輯控制器之if控制器的使用

    jmeter基礎(chǔ)邏輯控制器之if控制器的使用

    在實(shí)際工作中,當(dāng)使用JMeter做性能腳本或者接口腳本時(shí),當(dāng)遇到需要對(duì)不同的條件做不同的操作時(shí),我們可以使用JMeter中if控制器來(lái)實(shí)現(xiàn),本文就詳細(xì)的介紹一下如何使用
    2021-11-11
  • Java中文件寫入內(nèi)容的幾種常見方法

    Java中文件寫入內(nèi)容的幾種常見方法

    本文主要介紹了Java中文件寫入內(nèi)容的幾種常見方法,主要包括使用NIO的Files工具類、通過(guò)commons-io的FileUtils工具類、RandomAccessFile、PrintWriter和BufferedWriter這幾種,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • 舉例講解Java設(shè)計(jì)模式中的對(duì)象池模式編程

    舉例講解Java設(shè)計(jì)模式中的對(duì)象池模式編程

    這篇文章主要介紹了Java設(shè)計(jì)模式中的對(duì)象池模式編程示例分享,對(duì)象池模式經(jīng)常在多線程開發(fā)時(shí)被用到,需要的朋友可以參考下
    2016-02-02
  • 只用400行Java代碼就能實(shí)現(xiàn)的飛翔的小鳥游戲

    只用400行Java代碼就能實(shí)現(xiàn)的飛翔的小鳥游戲

    今天給大家?guī)?lái)的是關(guān)于Java實(shí)戰(zhàn)的相關(guān)知識(shí),文章圍繞著只用400行Java代碼就能實(shí)現(xiàn)的飛翔的小鳥游戲展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06

最新評(píng)論