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

Java學習之緩沖流的原理詳解

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

前言

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

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

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

字節(jié)緩沖流

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

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)讀取數據并寫入文件
        int b;
        while ((b=bis.read())!=-1){
            bos.write(b);
        }
        //釋放資源,不用釋放傳入的基本流
        bos.close();
        bis.close();
    }
}

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

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

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

原理

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

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

字符緩沖流

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

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

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() 方法可以實現換行的效果,避免了不同操作系統(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();
    }
}

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

相關文章

  • java簡單實現復制 粘貼 剪切功能代碼分享

    java簡單實現復制 粘貼 剪切功能代碼分享

    本文給大家分享了一段java編寫的簡單實現復制粘貼剪切功能的代碼,需要的小伙伴可以直接拿走使用。如有更好的方案,也可以告之本人。
    2014-11-11
  • MyBatis自動生成Where語句

    MyBatis自動生成Where語句

    這篇文章主要介紹了MyBatis自動生成Where語句的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • 在IDEA中配置Maven鏡像的最新方法

    在IDEA中配置Maven鏡像的最新方法

    這篇文章主要給大家介紹了關于在IDEA中配置Maven鏡像的最新方法,Maven是一個流行的Java項目構建工具,它依賴于互聯網上的Mave中央倉庫來下載和管理項目依賴庫,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • java中static關鍵字用法詳解

    java中static關鍵字用法詳解

    這篇文章主要為大家詳細介紹了java中static關鍵字的用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Java concurrency之CountDownLatch原理和示例_動力節(jié)點Java學院整理

    Java concurrency之CountDownLatch原理和示例_動力節(jié)點Java學院整理

    CountDownLatch是一個同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個或多個線程一直等待。 下面通過本文給大家分享Java concurrency之CountDownLatch原理和示例,需要的的朋友參考下吧
    2017-06-06
  • PowerJob的WorkerHealthReporter工作流程源碼解讀

    PowerJob的WorkerHealthReporter工作流程源碼解讀

    這篇文章主要為大家介紹了PowerJob的WorkerHealthReporter工作流程源碼解讀,
    2023-12-12
  • springboot整合freemarker的踩坑及解決

    springboot整合freemarker的踩坑及解決

    這篇文章主要介紹了springboot整合freemarker的踩坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Java 日期時間工具包–java.time的使用

    Java 日期時間工具包–java.time的使用

    這篇文章主要介紹了Java 日期時間工具包–java.time的使用,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-04-04
  • 解決springboot configuration processor對maven子模塊不起作用的問題

    解決springboot configuration processor對maven子模塊不起作用的問題

    這篇文章主要介紹了解決springboot configuration processor對maven子模塊不起作用的問題,本文通過圖文實例代碼給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Spring Boot如何整合FreeMarker模板引擎

    Spring Boot如何整合FreeMarker模板引擎

    這篇文章主要介紹了Spring Boot如何整合FreeMarker模板引擎,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10

最新評論