亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java中的字節流文件讀取教程(二)

2024-07-14 08:41:26
字體:
來源:轉載
供稿:網友

接著上篇文章,我們繼續來學習 Java 中的字節流操作。

裝飾者緩沖流 BufferedInput/OutputStream

裝飾者流其實是基于一種設計模式「裝飾者模式」而實現的一種文件 IO 流,而我們的緩沖流只是其中的一種,我們一起來看看。

在這之前,我們使用的文件讀寫流 FileInputStream 和 FileOutputStream 都是一個字節一個字節的從磁盤讀取或寫入,非常耗時。

而我們的緩沖流可以預先從磁盤一次性讀出指定容量的字節數到內存中,之后的讀取操作將直接從內存中讀取,提高效率。下面我們一起看看緩沖流的具體實現情況:

依然先以 BufferedInputStream 為例,我們簡單提一下它的幾個核心屬性:

  • private static int DEFAULT_BUFFER_SIZE = 8192;
  • protected volatile byte buf[];
  • private static int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8;
  • protected int count;
  • protected int pos;
  • protected int markpos = -1;
  • protected int marklimit;

buf 就是用于緩沖讀的字節數組,它的值將隨著流的讀取而不停的被填充,繼而后續的讀操作可以直接基于這個緩沖數組。

DEFAULT_BUFFER_SIZE 規定了默認緩沖區的大小,即 buf 的數組長度。MAX_BUFFER_SIZE 指明了緩沖區的上限。

count 指向緩沖數組中最后一個有效字節索引后一位。pos 指向下一個待讀取的字節索引位置。

markpos 和 marklimit 用于重復讀操作。

接著我們看看 BufferedInputStream 的幾個示例構造器:

public BufferedInputStream(InputStream in) { this(in, DEFAULT_BUFFER_SIZE);}
public BufferedInputStream(InputStream in, int size) { super(in); if (size <= 0) { throw new IllegalArgumentException("Buffer size <= 0"); } buf = new byte[size];}

整體上來說,前者只需要傳入一個「被裝飾」的 InputStream 實例,并使用默認大小的緩沖區。后者則可以顯式指明緩沖區的大小。

除此之外,super(in) 會將這個 InputStream 實例保存進父類 FilterInputStream 的 in 屬性字段中,并且所有實際的磁盤讀操作都由這個 InputStream 實例發出。

下面我們來看最重要的讀操作以及緩沖區是如何被填充的。

public synchronized int read() throws IOException { if (pos >= count) { fill(); if (pos >= count)  return -1; } return getBufIfOpen()[pos++] & 0xff;}

這個方法想必大家已經很熟悉了,從流中讀取下一個字節并返回,但細節上的實現還是稍稍有些不同。

count 指向了緩沖數組中有效字節索引后一位置處,pos 指向下一個待讀取的字節索引位置。理論上 pos 是不可能大于 count 的,最多等于。

如果 pos 等于 count,那說明緩沖數組中所有有效字節都已經被讀取過了,此時即需要丟棄緩沖區中那些「無用」的數據,從磁盤重新加載一批新數據填充緩沖區。

而事實上,fill 方法就是做的這個事情,它的代碼比較多,就不帶大家去解析了,你理解了它的作用,想必分析它的實現也是容易的。

如果 fill 方法調用之后,pos 依然 等于 count,那么說明 InputStream 實例并沒有從流中讀取出任何數據,也即文件流中無數據可讀。關于這一點,參見 fill 方法 246 行。

總的來說,如果成功填充了緩沖區,那么我們的 read 方法將直接從緩沖區取出一個字節返回給調用者。

public synchronized int read(byte b[], int off, int len){ //.....}

這個方法也是「熟人」了,不再多余的解釋了,實現是類似的。

skip 方法用于跳過指定長度的字節數進行文件流的繼續讀?。?/p>

public synchronized long skip(long n){ //.....}

注意一點的是,skip 方法盡量去跳過 n 個字節,但不保證一定跳過 n 個字節,方法返回的是實際跳過的字節數。如果緩沖數組中剩余可用字節數小于 n,那么最終將跳過緩沖數組中實際可跳過的字節數。

最后要說一說這個 close 方法:

public void close() throws IOException { byte[] buffer; while ( (buffer = buf) != null) { if (bufUpdater.compareAndSet(this, buffer, null)) {  InputStream input = in;  in = null;  if (input != null)  input.close();  return; } // Else retry in case a new buf was CASed in fill() }}

close 方法將賦空「被裝飾者」流,并調用它的 close 方法釋放相關資源,最終也會清空緩沖數組所占用的內存空間。

BufferedInputStream 提供了讀緩沖能力,而 BufferedOutputStream 則提供了寫緩沖能力,即內存的寫操作并不會立馬更新到磁盤,暫時保存在緩沖區,待緩沖區滿時一并寫入。

protected byte buf[];protected int count;

buf 代表了內部緩沖區,count 表示緩沖區中實際數據容量,即 buf 中有效字節數,而不是 buf 數組長度。

public BufferedOutputStream(OutputStream out) { this(out, 8192);}public BufferedOutputStream(OutputStream out, int size) { super(out); if (size <= 0) { throw new IllegalArgumentException("Buffer size <= 0"); } buf = new byte[size];}

一樣的實現思路,必須提供的是一個 OutputStream 輸出流實例,也可以選擇性指明緩沖區大小。

public synchronized void write(int b) throws IOException { if (count >= buf.length) { flushBuffer(); } buf[count++] = (byte)b;}

寫方法將首先檢查緩沖區是否還能容納本次寫操作,如果不能將發起一次磁盤寫操作,將緩沖區數據全部寫入磁盤文件,否則將優先寫入緩沖區。

當然,BufferedOutputStream 也提供了 flush 方法向外提供接口,也即不一定非要等到緩沖區滿了才向磁盤寫數據,你也可以顯式的調用該方法讓它清空緩沖區并更新磁盤文件。

public synchronized void flush() throws IOException { flushBuffer(); out.flush();}

關于緩沖流,核心內容介紹如上,這是一種能夠顯著提升效率的流,通過它,能夠減少磁盤訪問次數,提升程序執行效率。

有關對象序列化流 ObjectInput/OutputStream 以及基于基本類型的裝飾者流 DataInput/OutputStream 我們這里暫時不做討論。待到我們學習序列化的時候,再回頭討論這兩個字節流。

文章中的所有代碼、圖片、文件都云存儲在我的 GitHub 上:

(https://github.com/SingleYam/overview_java)

大家也可以選擇通過本地下載。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美日韩高清| 在线亚洲午夜片av大片| 欧美一区二区三区……| 欧美高跟鞋交xxxxhd| 日韩精品在线影院| 亚洲mm色国产网站| 久久色在线播放| 亚洲精品成人久久| 国产精品678| www.久久色.com| 色综合久久精品亚洲国产| 欧美日韩高清在线观看| 日韩av在线影视| 国产91色在线播放| 国产精品91在线| 97色伦亚洲国产| 日韩成人xxxx| 一区二区三区视频在线| 国产aⅴ夜夜欢一区二区三区| 欧美怡春院一区二区三区| 精品视频在线播放| 亚洲国产精品国自产拍av秋霞| 久久久在线观看| 久久久99久久精品女同性| 欧美国产高跟鞋裸体秀xxxhd| 一区二区三欧美| 中文字幕av一区二区| 欧美最顶级丰满的aⅴ艳星| 57pao国产精品一区| 欧美超级乱淫片喷水| 69视频在线免费观看| 亚洲第一福利在线观看| 黑人巨大精品欧美一区二区一视频| 国产aaa精品| 欧美性xxxx极品高清hd直播| 欧美在线www| 国产精品久久久久久久久久东京| 亚洲国产又黄又爽女人高潮的| 91理论片午午论夜理片久久| 国内精品一区二区三区四区| 亚洲精品97久久| 国产亚洲xxx| 中文字幕日韩av综合精品| 日本老师69xxx| 成人免费激情视频| 成人在线精品视频| 97在线精品视频| 国产成人精品日本亚洲专区61| 欧美日韩不卡合集视频| 欧美另类精品xxxx孕妇| 精品国产31久久久久久| 国产精品一区专区欧美日韩| 大伊人狠狠躁夜夜躁av一区| 日本中文字幕不卡免费| 欧美精品videosex性欧美| 在线不卡国产精品| 欧美福利视频在线| 色综合久久精品亚洲国产| 国产亚洲在线播放| 久久好看免费视频| 国产精品av免费在线观看| 欧美高清自拍一区| 亚洲毛片在线免费观看| 亚洲片在线观看| 97精品欧美一区二区三区| 亚洲一区二区国产| 国产一区二区丝袜高跟鞋图片| 欧美日韩国产综合新一区| 久久人人爽人人爽人人片av高清| 中文字幕亚洲色图| 91精品久久久久久久久久入口| 亚洲精品videossex少妇| 日韩av最新在线观看| 亚洲天堂av网| 久久综合国产精品台湾中文娱乐网| 国产xxx69麻豆国语对白| 欧美www在线| 欧美性视频网站| 国产精品国内视频| 亚洲视频在线免费看| 午夜精品视频在线| 91欧美日韩一区| 亚洲国内精品视频| 欧美精品在线视频观看| 亚洲国内精品在线| 成人国产精品久久久久久亚洲| 亚洲国产另类久久精品| 亚洲国产欧美一区二区三区久久| 亚洲人成人99网站| 国产精品日韩专区| 6080yy精品一区二区三区| 色偷偷91综合久久噜噜| 国产91ⅴ在线精品免费观看| 亚洲第一二三四五区| 久久久亚洲精品视频| 亚洲精品成人免费| 欧美wwwxxxx| 久久夜色精品国产欧美乱| 2019中文字幕在线免费观看| 国产亚洲精品激情久久| 久久久噜噜噜久久| 亚洲欧美国产精品va在线观看| www.亚洲成人| 日韩欧美有码在线| 亚洲国产一区二区三区在线观看| 欧美在线视频免费播放| 51ⅴ精品国产91久久久久久| 国产综合久久久久| 精品视频在线观看日韩| 成人精品一区二区三区电影黑人| 日韩精品视频在线观看免费| 国内精品久久久久久中文字幕| 亚洲成人动漫在线播放| 国产精品成人v| 久青草国产97香蕉在线视频| 久久久久久有精品国产| 精品在线欧美视频| 成人精品一区二区三区电影免费| yw.139尤物在线精品视频| 性色av一区二区三区免费| 精品国产一区av| 久久久伊人日本| 97国产成人精品视频| 亚洲最新视频在线| 日韩不卡中文字幕| 亚洲毛片在线免费观看| 国产精品久久久久高潮| 日韩美女中文字幕| 97精品视频在线观看| 欧美日韩加勒比精品一区| 亚洲人成网在线播放| 久久久日本电影| 中文字幕日本精品| **欧美日韩vr在线| 色偷偷av一区二区三区乱| 一区二区三区视频免费在线观看| 亚洲人成电影网站| 亚洲激情视频在线播放| 亚洲毛片在线免费观看| 亚洲欧美日韩精品久久奇米色影视| 日韩中文字幕在线视频播放| 欧美激情精品久久久久久免费印度| 成人欧美一区二区三区在线湿哒哒| 久久人人爽人人爽人人片av高清| 欧美成人国产va精品日本一级| 久久99青青精品免费观看| 国产+成+人+亚洲欧洲| 欧美大片第1页| 欧美高清视频一区二区| 亚洲人成网在线播放| 91av在线免费观看视频| 亚洲精品福利免费在线观看| 51午夜精品视频| 亚洲人精品午夜在线观看| 一区二区三区视频免费| 91免费的视频在线播放| 亚洲欧美日韩网| 成人性教育视频在线观看| 欧美成人在线免费视频| 久久精品国产视频| 国产精品久久久久久久久久免费| 欧美孕妇与黑人孕交| 69久久夜色精品国产7777| 成人久久久久久久|