摘要:輸入流的復(fù)用在實(shí)際的開發(fā)中是很常見的場(chǎng)景。根據(jù)對(duì)的抽象,流的復(fù)用是矛盾的。檢查當(dāng)前流類是否支持標(biāo)記功能這三個(gè)方法能有效地解決流復(fù)用的問題。
輸入流的復(fù)用在實(shí)際的開發(fā)中是很常見的場(chǎng)景。
在實(shí)際應(yīng)用中,很多需要提供輸入數(shù)據(jù)的API都是用IputStream類作為其參數(shù)類型,比如XML文檔的解析API就是一個(gè)典型的例子。同時(shí)很多數(shù)據(jù)的提供者允許使用者通過InputStream類的對(duì)象方式來讀取數(shù)據(jù)。
根據(jù)java對(duì)io的抽象(Stream),流的復(fù)用是矛盾的。按照流本身所代表的抽象含義,數(shù)據(jù)一旦流過去了,就無法被再次利用了。
對(duì)于現(xiàn)實(shí)應(yīng)用中存在的對(duì)輸入流的需求,基本上來說的兩種方式可以解決;第一種是利用輸入流提供的標(biāo)記和重置的控制能力,第二種則是把輸入流轉(zhuǎn)換成數(shù)據(jù)來使用。
方法一, 緩沖流類標(biāo)記與重置好在java為我們提供現(xiàn)成的解決方案。
BufferedInputStream, BufferedOutputStream
利用這兩個(gè)類中提供的
public synchronized void mark(int readlimit) 讀取位置標(biāo)記,需要一個(gè)允許讀取的字節(jié)數(shù)。
public synchronized void reset() throws IOException 將讀取位置重置到標(biāo)記位置。
public boolean markSupported() 檢查當(dāng)前流類是否支持標(biāo)記功能
這三個(gè)方法能有效地解決流復(fù)用的問題。
java // 假如我們有三個(gè)方法,需要串行的使用我們的 io 輸入流。 // public static void process1(InputStream in) throws IOException; // public static void process2(InputStream in) throws IOException; // public static void process3(InputStream in) throws IOException; if (!input.markSupported()) { this.input = new BufferedInputStream(input); } else { this.input = input; } // 為了能夠復(fù)用整個(gè)流 this.input.mark(Integer.MAX_VALUE); process1(this.input); // 重置讀取位置,以供下一個(gè)使用者使用,以下雷同 this.input.reset(); process2(this.input); this.input.reset(); process3(this.input); this.input.reset();方法二, 將流轉(zhuǎn)化成為數(shù)據(jù)流類
這一種方案就是將流中的數(shù)據(jù)全部讀取到一個(gè)字節(jié)數(shù)組中。在不同的數(shù)據(jù)接收者之間這些數(shù)據(jù)的傳遞是通過字節(jié)數(shù)組完成的。
將 字節(jié)流轉(zhuǎn)化成字節(jié)數(shù)組 可以使用我們 ByteArrayInputStream,ByteArrayOutputStream。這樣的話,我們傳遞的是數(shù)據(jù),而不再是原始的io。
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[2048]; for (int count=0; ( inputStream.read(buffer) ) != -1; ) { arrayOutputStream.write(buffer, 0, count); } ByteArrayInputStream byteArrayOutputStream = new ByteArrayInputStream(arrayOutputStream.toByteArray()); // byteArrayOutputStream 對(duì)象就可以作為我們需要復(fù)用的數(shù)據(jù)流,配合 `mark`和`reset` 功能提高io性能。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64225.html
摘要:綁定完成后允許套接字進(jìn)行連接并等待連接。服務(wù)端根據(jù)報(bào)文返回響應(yīng),并關(guān)閉連接。單線程服務(wù)器多進(jìn)程及多線程服務(wù)器復(fù)用服務(wù)器復(fù)用的多線程服務(wù)器單線程服務(wù)器一次只處理一個(gè)請(qǐng)求,直到其完成為止。 前言 本篇文章將涉及以下內(nèi)容: IO實(shí)現(xiàn)Java Socket通信 NIO實(shí)現(xiàn)Java Socket通信 閱讀本文之前最好了解過: Java IO Java NIO Java Concurrenc...
摘要:從通道進(jìn)行數(shù)據(jù)寫入創(chuàng)建一個(gè)緩沖區(qū),填充數(shù)據(jù),并要求通道寫入數(shù)據(jù)。三之通道主要內(nèi)容通道介紹通常來說中的所有都是從通道開始的。從中選擇選擇器維護(hù)注冊(cè)過的通道的集合,并且這種注冊(cè)關(guān)系都被封裝在當(dāng)中停止選擇的方法方法和方法。 由于內(nèi)容比較多,我下面放的一部分是我更新在我的微信公眾號(hào)上的鏈接,微信排版比較好看,更加利于閱讀。每一篇文章下面我都把文章的主要內(nèi)容給列出來了,便于大家學(xué)習(xí)與回顧。 Ja...
摘要:三同步非阻塞式以塊的方式處理數(shù)據(jù)面向緩存區(qū)的采用多路復(fù)用模式基于事件驅(qū)動(dòng)是實(shí)現(xiàn)了的一個(gè)流行框架,的。阿里云分布式文件系統(tǒng)里用的就是。四異步非阻塞式基于事件驅(qū)動(dòng),不需要多路復(fù)用器對(duì)注冊(cè)通道進(jìn)行輪詢,采用設(shè)計(jì)模式。 一、什么是IO IO 輸入、輸出 (read write accept)IO是面向流的 二、BIO BIO是同步阻塞式IO 服務(wù)端與客戶端進(jìn)行三次握手后一個(gè)鏈路建立一個(gè)線程面...
摘要:三同步非阻塞式以塊的方式處理數(shù)據(jù)面向緩存區(qū)的采用多路復(fù)用模式基于事件驅(qū)動(dòng)是實(shí)現(xiàn)了的一個(gè)流行框架,的。阿里云分布式文件系統(tǒng)里用的就是。四異步非阻塞式基于事件驅(qū)動(dòng),不需要多路復(fù)用器對(duì)注冊(cè)通道進(jìn)行輪詢,采用設(shè)計(jì)模式。 一、什么是IO IO 輸入、輸出 (read write accept)IO是面向流的 二、BIO BIO是同步阻塞式IO 服務(wù)端與客戶端進(jìn)行三次握手后一個(gè)鏈路建立一個(gè)線程面...
摘要:基本輸入流輸入流類中包含兩類功能輸入流的兩大功能讀取流中字節(jié)數(shù)據(jù)的功能是通過方法來完成?;据敵隽髋c類相對(duì)應(yīng)的類表示基本的輸出流,用來把數(shù)據(jù)從程序輸出到其他地方。 一堆廢話(趕快跳過) 在我們的日常開發(fā)中 I/O 涉及到我們開發(fā)的方方面面,雖然早在 JDK1.5 就新增了 NIO的概念,但是 java.io 的使用以及技巧在我們的日常開發(fā)中還是占據(jù)很高的比重。 概念(不看也行) ...
閱讀 3055·2021-11-25 09:43
閱讀 1650·2021-11-24 11:15
閱讀 2371·2021-11-22 15:25
閱讀 3516·2021-11-11 16:55
閱讀 3253·2021-11-04 16:10
閱讀 2785·2021-09-14 18:02
閱讀 1697·2021-09-10 10:50
閱讀 1081·2019-08-29 15:39