文件操作(5)高級(jí)流之緩沖流BufferedOutputStream、BufferedInputStream

1、java.io.BufferedOutputStream和BufferedInputStream.

緩沖流是一對(duì)高級(jí)流,作用是提高讀寫數(shù)據(jù)的效率.

緩沖流內(nèi)部有一個(gè)字節(jié)數(shù)組,默認(rèn)長(zhǎng)度是8K.緩沖流讀寫數(shù)據(jù)時(shí)一定是將數(shù)據(jù)的讀寫方式轉(zhuǎn)換為塊讀寫來保證讀寫效率.

2、 java.io.BufferedOutputStream緩沖字節(jié)輸出流,繼承自java.io.OutputStream

  • 常用構(gòu)造器

BufferedOutputStream(OutputStream out):創(chuàng)建一個(gè)默認(rèn)8kb大小緩沖區(qū)的緩沖字節(jié)輸出流,并連接到參數(shù)指定的字節(jié)輸出流上。

BufferedOutputStream(OutputStream out,int size):創(chuàng)建一個(gè)size指定大小(單位是字節(jié))緩沖區(qū)的緩沖字節(jié)輸出流,并連接到參數(shù)指定的字節(jié)輸出流上。

  • 常用方法

flush():強(qiáng)制將緩沖區(qū)中已經(jīng)緩存的數(shù)據(jù)一次性寫出

緩沖流的寫出方法功能與OutputStream上一致,需要知道的時(shí)write方法調(diào)用后并非實(shí)際寫出,而是先將數(shù)據(jù)存入緩沖區(qū)(內(nèi)部的字節(jié)數(shù)組中),當(dāng)緩沖區(qū)滿了時(shí)會(huì)自動(dòng)寫出一次。

3、 java.io.BufferedInputStream緩沖字節(jié)輸出流,繼承自java.io.InputStream

  • 常用構(gòu)造器

BufferedInputStream(InputStream in):創(chuàng)建一個(gè)默認(rèn)8kb大小緩沖區(qū)的緩沖字節(jié)輸入流,并連接到參數(shù)指定的字節(jié)輸入流上。

BufferedInputStream(InputStream in,int size):創(chuàng)建一個(gè)size指定大小(單位是字節(jié))緩沖區(qū)的緩沖字節(jié)輸入流,并連接到參數(shù)指定的字節(jié)輸入流上。

  • 常用方法

緩沖流的讀取方法功能與InputStream上一致,需要知道的時(shí)read方法調(diào)用后緩沖流會(huì)一次性讀取緩沖區(qū)大小的字節(jié)數(shù)據(jù)并存入緩沖區(qū),然后再根據(jù)我們調(diào)用read方法讀取的字節(jié)數(shù)進(jìn)行返回,直到緩沖區(qū)所有數(shù)據(jù)都已經(jīng)通過read方法返回后會(huì)再次讀取一組數(shù)據(jù)進(jìn)緩沖區(qū)。即:塊讀取操作

4、使用緩沖流完成文件復(fù)制操作

import java.io.*;

/**
 * java將流分為節(jié)點(diǎn)流與處理流兩類
 * 節(jié)點(diǎn)流:也稱為低級(jí)流,是真實(shí)連接程序與另一端的"管道",負(fù)責(zé)實(shí)際讀寫數(shù)據(jù)的流。
 * 讀寫一定是建立在節(jié)點(diǎn)流的基礎(chǔ)上進(jìn)行的。
 * 節(jié)點(diǎn)流好比家里的"自來水管"。連接我們的家庭與自來水廠,負(fù)責(zé)搬運(yùn)水。
 * 處理流:也稱為高級(jí)流,不能獨(dú)立存在,必須連接在其他流上,目的是當(dāng)數(shù)據(jù)經(jīng)過當(dāng)前流時(shí)
 *對(duì)其進(jìn)行某種加工處理,簡(jiǎn)化我們對(duì)數(shù)據(jù)的同等操作。
 *高級(jí)流好比家里常見的對(duì)水做加工的設(shè)備,比如"凈水器","熱水器"。
 * 有了它們我們就不必再自己對(duì)水進(jìn)行加工了。
 * 實(shí)際開發(fā)中我們經(jīng)常會(huì)串聯(lián)一組高級(jí)流最終連接到低級(jí)流上,在讀寫操作時(shí)以流水線式的加工
 * 完成復(fù)雜IO操作。這個(gè)過程也稱為"流的連接"。
 * 緩沖流,是一對(duì)高級(jí)流,作用是加快讀寫效率。
 * java.io.BufferedInputStream和java.io.BufferedOutputStream
 *
 */
public class CopyDemo3 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("ppt.pptx");
        BufferedInputStream bis = new BufferedInputStream(fis);
        FileOutputStream fos = new FileOutputStream("ppt_cp.pptx");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        int d;
        long start = System.currentTimeMillis();
        while((d = bis.read())!=-1){//使用緩沖流讀取字節(jié)
            bos.write(d);//使用緩沖流寫出字節(jié)
        }
        long end = System.currentTimeMillis();
        System.out.println("耗時(shí):"+(end-start)+"ms");
        bis.close();//關(guān)閉流時(shí)只需要關(guān)閉高級(jí)流即可,它會(huì)自動(dòng)關(guān)閉它連接的流
        bos.close();
    }
}

3、緩沖輸出流寫出數(shù)據(jù)時(shí)的緩沖區(qū)問題

通過緩沖流寫出的數(shù)據(jù)會(huì)被臨時(shí)存入緩沖流內(nèi)部的字節(jié)數(shù)組,直到數(shù)組存滿數(shù)據(jù)才會(huì)真實(shí)寫出一次

import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * 緩沖輸出流寫出數(shù)據(jù)的緩沖區(qū)問題
 */
public class BOS_FlushDemo {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("bos.txt");
        BufferedOutputStream bos = new BufferedOutputStream(fos);

        String line = "奧里給!";
        byte[] data = line.getBytes(StandardCharsets.UTF_8);
        bos.write(data);
        System.out.println("寫出完畢!");
        /*
            緩沖流的flush方法用于強(qiáng)制將緩沖區(qū)中已經(jīng)緩存的數(shù)據(jù)一次性寫出。
            注:該方法實(shí)際上實(shí)在字節(jié)輸出流的超類OutputStream上定義的,并非只有緩沖
            輸出流有這個(gè)方法。但是實(shí)際上只有緩沖輸出流的該方法有實(shí)際意義,其他的流實(shí)現(xiàn)
            該方法的目的僅僅是為了在流連接過程中傳遞flush動(dòng)作給緩沖輸出流。
         */
        bos.flush();//沖
        bos.close();

    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容