最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java學(xué)習(xí)之緩沖流的原理詳解

 更新時間:2023年01月28日 14:29:53   作者:橙?子_  
為了提高其數(shù)據(jù)的讀寫效率,Java中又定義了四種緩沖流,分別是:字節(jié)緩沖輸入流、字節(jié)緩沖輸出流、字符緩沖輸入流和字符緩沖輸出流。本文主要來和大家聊聊這些緩沖流的原理,希望對大家有所幫助

前言

前面我們已經(jīng)學(xué)習(xí)了四種對文件數(shù)據(jù)操作的基本流,字節(jié)輸入流,字節(jié)輸出流,字符輸入流,字符輸出流。為了提高其數(shù)據(jù)的讀寫效率,Java中又定義了四種緩沖流,分別是:

  • 字節(jié)緩沖輸入流 BufferedInputStream
  • 字節(jié)緩沖輸出流 BufferedOutputStream
  • 字符緩沖輸入流 BufferedReader
  • 字符緩沖輸出流 BufferedWriter

其實,高級流不僅這里的緩沖流,還有數(shù)據(jù)流,轉(zhuǎn)換流,打印流等。高級流都是對基本流的封裝,其底層依舊使用基本流讀寫數(shù)據(jù),但是其新增了一些非常好用的方法。

字節(jié)緩沖流

字節(jié)緩沖輸入流 BufferedInputStream 可以用于高效的讀取數(shù)據(jù),其底層默認自帶了一個長度為 8192 的緩沖區(qū),你也可以自定義緩沖區(qū)長度。在使用時是把基本流包裝成高級流,其本質(zhì)是使用底層的基本流讀取數(shù)據(jù)。

JDK中的源碼:

    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];
    }

示例,使用字節(jié)緩沖流拷貝文件:

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException {
        /*
        利用字節(jié)緩沖流拷貝文件
         */
        
        //1. 創(chuàng)建緩沖流對象
        BufferedInputStream bis=new BufferedInputStream(new FileInputStream("test.txt"));
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("copy.txt"));
        //循環(huán)讀取數(shù)據(jù)并寫入文件
        int b;
        while ((b=bis.read())!=-1){
            bos.write(b);
        }
        //釋放資源,不用釋放傳入的基本流
        bos.close();
        bis.close();
    }
}

同樣的,我們可以一次讀取多個字節(jié),要實現(xiàn)這個功能,只需要往 read() 方法總傳入一個字節(jié)數(shù)組,一次讀取幾個字節(jié)由數(shù)組的大小決定,同時往 write() 方法中傳入開始索引和寫入的長度 len,防止寫入殘留數(shù)據(jù)。

示例,改寫上面的拷貝文件的程序:

//一次讀取多個字節(jié)的數(shù)據(jù)
byte[] bytes = new byte[1024];
int len;
while ((len=bis.read(bytes))!=-1){
    bos.write(bytes,0,len);
}

原理

使用緩沖字節(jié)流提高了數(shù)據(jù)的讀寫效率,其底層依然是使用前面談到的字節(jié)輸入流和字節(jié)輸出流兩種基本流讀取數(shù)據(jù),程序在內(nèi)存中默認產(chǎn)生一個長度為 8192 的緩沖區(qū),此時在內(nèi)存中進行數(shù)據(jù)的交換效率是非常高的。

讀取數(shù)據(jù)時既可以使用無參的 read() 方法,也可以使用傳入字節(jié)數(shù)組的 read() 方法。 前者返回數(shù)據(jù)在字符集中的十進制數(shù),讀取到文件末尾時返回 -1 ,后者返回讀取的數(shù)據(jù)個數(shù),讀取的數(shù)據(jù)在字符集中對應(yīng)的十進制數(shù)存放在數(shù)組中,讀取到文件末尾時返回 -1。讀取數(shù)據(jù)是一個解碼的過程,如下圖:

字符緩沖流

在使用字符流操作本地文件的數(shù)據(jù)時,當創(chuàng)建字符流對象時,其實在底層已經(jīng)默認生成了一個長度為 8192 的數(shù)組,這塊內(nèi)存被稱為緩沖區(qū)。所以使用字符緩沖流來讀寫數(shù)據(jù)提升的效率并不是特別明顯,但是在字符緩沖流中封裝了一些方法,方便對數(shù)據(jù)的讀寫。

使用 readLine() 方法一次讀取一行的數(shù)據(jù),遇到回車換行符停止,返回 null,但是并不會把回車換行符讀取到內(nèi)存中。示例:

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("test.txt"));
        String s;
        while ((s=br.readLine())!=null){
            System.out.println(s);
        }
        br.close();
    }
}

使用 newLine() 方法可以實現(xiàn)換行的效果,避免了不同操作系統(tǒng)換行符不同的問題,示例:

import java.io.*;

???????public class Test {
    public static void main(String[] args) throws IOException {
        BufferedWriter bw=new BufferedWriter(new FileWriter("test.txt",true));
        bw.write("123");
        bw.newLine();
        bw.write("456");
        bw.close();
    }
}

到此這篇關(guān)于Java學(xué)習(xí)之緩沖流的原理詳解的文章就介紹到這了,更多相關(guān)Java緩沖流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java版C語言版簡單使用靜態(tài)語言實現(xiàn)動態(tài)數(shù)組的方法

    Java版C語言版簡單使用靜態(tài)語言實現(xiàn)動態(tài)數(shù)組的方法

    本文給大家分享java版和C語言版簡單使用靜態(tài)語言實現(xiàn)動態(tài)數(shù)組的方法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-10-10
  • SpringBoot基于Redis實現(xiàn)token的在線續(xù)期的實踐

    SpringBoot基于Redis實現(xiàn)token的在線續(xù)期的實踐

    本文主要介紹了使用Redis實現(xiàn)JWT令牌在線續(xù)期的方案,通過在線續(xù)期token,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • SpringBoot整合MyBatis的代碼詳解

    SpringBoot整合MyBatis的代碼詳解

    這篇文章主要介紹了SpringBoot整合MyBatis筆記記錄,大家需要注意在整合mybatis之前我們需要相對應(yīng)的導(dǎo)入相關(guān)依賴,首先需要在java的目錄和resources下創(chuàng)建mapper文件夾,對SpringBoot整合MyBatis的詳細過程感興趣的朋友一起看看吧
    2022-05-05
  • SpringBoot整合Gson 整合Fastjson的實例詳解

    SpringBoot整合Gson 整合Fastjson的實例詳解

    這篇文章主要介紹了SpringBoot整合Gson 整合Fastjson的實例詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Hibernate中Session.get()方法和load()方法的詳細比較

    Hibernate中Session.get()方法和load()方法的詳細比較

    今天小編就為大家分享一篇關(guān)于Hibernate中Session.get()方法和load()方法的詳細比較,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Java獲取視頻時長和封面截圖

    Java獲取視頻時長和封面截圖

    這篇文章主要為大家詳細介紹了如何使用Java獲取視頻時長和封面截圖功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • java生成sm2/hutool生成公鑰私鑰代碼示例

    java生成sm2/hutool生成公鑰私鑰代碼示例

    這篇文章主要給大家介紹了關(guān)于java生成sm2/hutool生成公鑰私鑰的相關(guān)資料,Java是一種廣泛使用的編程語言,可以用來生成公鑰和私鑰文件,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • spring的@Transactional注解用法解讀

    spring的@Transactional注解用法解讀

    這篇文章主要介紹了spring的@Transactional注解用法解讀,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • JavaIO字符操作和對象操作示例詳解

    JavaIO字符操作和對象操作示例詳解

    這篇文章主要為大家介紹了JavaIO字符操作和對象操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • java基于包結(jié)構(gòu)的請求路由實現(xiàn)實例分享

    java基于包結(jié)構(gòu)的請求路由實現(xiàn)實例分享

    基于包結(jié)構(gòu)的請求路由簡單實現(xiàn)實例分享,大家參考使用吧
    2013-12-12

最新評論

鄂州市| 行唐县| 烟台市| 邯郸县| 青田县| 五华县| 江达县| 广灵县| 扎兰屯市| 淅川县| 尉氏县| 将乐县| 工布江达县| 斗六市| 新沂市| 漾濞| 昌平区| 乳源| 鹿泉市| 祁连县| 瑞安市| 平和县| 武山县| 栾城县| 宁陵县| 邯郸市| 从化市| 阜城县| 静宁县| 合肥市| 韩城市| 白山市| 衡阳市| 都兰县| 海林市| 保康县| 竹北市| 乌兰浩特市| 朝阳县| 驻马店市| 霍城县|