" />

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

Java IO之包裝流詳解

 更新時(shí)間:2022年01月19日 16:54:45   作者:YSOcean  
這篇文章主要為大家介紹了Java IO之包裝流,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

根據(jù)功能分為節(jié)點(diǎn)流和包裝流(處理流)

節(jié)點(diǎn)流:可以從或向一個(gè)特定的地方(節(jié)點(diǎn))讀寫數(shù)據(jù)。如FileReader.

處理流:是對一個(gè)已存在的流的連接和封裝,通過所封裝的流的功能調(diào)用實(shí)現(xiàn)數(shù)據(jù)讀寫。如BufferedReader.處理流的構(gòu)造方法總是要帶一個(gè)其他的流對象做參數(shù)。一個(gè)流對象經(jīng)過其他流的多次包裝,稱為流的鏈接。

1、前面講的字符輸入輸出流,字節(jié)輸入輸出流都是字節(jié)流。那么什么是包裝流呢?

①、包裝流隱藏了底層節(jié)點(diǎn)流的差異,并對外提供了更方便的輸入\輸出功能,讓我們只關(guān)心這個(gè)高級流的操作

②、使用包裝流包裝了節(jié)點(diǎn)流,程序直接操作包裝流,而底層還是節(jié)點(diǎn)流和IO設(shè)備操作

③、關(guān)閉包裝流的時(shí)候,只需要關(guān)閉包裝流即可

2、緩沖流  

緩沖流:是一個(gè)包裝流,目的是緩存作用,加快讀取和寫入數(shù)據(jù)的速度。

字節(jié)緩沖流BufferedInputStream、BufferedOutputStream

字符緩沖流BufferedReader、BufferedWriter

案情回放:我們在將字符輸入輸出流、字節(jié)輸入輸出流的時(shí)候,讀取操作,通常都會定義一個(gè)字節(jié)或字符數(shù)組,將讀取/寫入的數(shù)據(jù)先存放到這個(gè)數(shù)組里面,然后在取數(shù)組里面的數(shù)據(jù)。這比我們一個(gè)一個(gè)的讀取/寫入數(shù)據(jù)要快很多,而這也就是緩沖流的由來。只不過緩沖流里面定義了一個(gè) 數(shù)組用來存儲我們讀取/寫入的數(shù)據(jù),當(dāng)內(nèi)部定義的數(shù)組滿了(注意:我們操作的時(shí)候外部還是會定義一個(gè)小的數(shù)組,小數(shù)組放入到內(nèi)部數(shù)組中),就會進(jìn)行下一步操作。       

下面是沒有用緩沖流的操作:   

//1、創(chuàng)建目標(biāo)對象,輸入流表示那個(gè)文件的數(shù)據(jù)保存到程序中。不寫盤符,默認(rèn)該文件是在該項(xiàng)目的根目錄下
            //a.txt 保存的文件內(nèi)容為:AAaBCDEF
        File target = new File("io"+File.separator+"a.txt");
        //2、創(chuàng)建輸入流對象
        InputStream in = new FileInputStream(target);
        //3、具體的 IO 操作(讀取 a.txt 文件中的數(shù)據(jù)到程序中)
            /**
             * 注意:讀取文件中的數(shù)據(jù),讀到最后沒有數(shù)據(jù)時(shí),返回-1
             *  int read():讀取一個(gè)字節(jié),返回讀取的字節(jié)
             *  int read(byte[] b):讀取多個(gè)字節(jié),并保存到數(shù)組 b 中,從數(shù)組 b 的索引為 0 的位置開始存儲,返回讀取了幾個(gè)字節(jié)
             *  int read(byte[] b,int off,int len):讀取多個(gè)字節(jié),并存儲到數(shù)組 b 中,從數(shù)組b 的索引為 0 的位置開始,長度為len個(gè)字節(jié)
             */
        //int read():讀取一個(gè)字節(jié),返回讀取的字節(jié)
        int data1 = in.read();//獲取 a.txt 文件中的數(shù)據(jù)的第一個(gè)字節(jié)
        System.out.println((char)data1); //A
        //int read(byte[] b):讀取多個(gè)字節(jié)保存到數(shù)組b 中
        byte[] buffer  = new byte[10];//這里我們定義了一個(gè) 長度為 10 的字節(jié)數(shù)組,用來存儲讀取的數(shù)據(jù)
        in.read(buffer);//獲取 a.txt 文件中的前10 個(gè)字節(jié),并存儲到 buffer 數(shù)組中
        System.out.println(Arrays.toString(buffer)); //[65, 97, 66, 67, 68, 69, 70, 0, 0, 0]
        System.out.println(new String(buffer)); //AaBCDEF[][][]
        //int read(byte[] b,int off,int len):讀取多個(gè)字節(jié),并存儲到數(shù)組 b 中,從索引 off 開始到 len
        in.read(buffer, 0, 3);
        System.out.println(Arrays.toString(buffer)); //[65, 97, 66, 0, 0, 0, 0, 0, 0, 0]
        System.out.println(new String(buffer)); //AaB[][][][][][][]
        //4、關(guān)閉流資源
        in.close();

我們查看 緩沖流的 JDK 底層源碼,可以看到,程序中定義了這樣的 緩存數(shù)組,大小為 8192

BufferedInputStream:

BufferedOutputStream:

//字節(jié)緩沖輸入流
        BufferedInputStream bis = new BufferedInputStream(
                new FileInputStream("io"+File.separator+"a.txt"));
        //定義一個(gè)字節(jié)數(shù)組,用來存儲數(shù)據(jù)
        byte[] buffer = new byte[1024];
        int len = -1;//定義一個(gè)整數(shù),表示讀取的字節(jié)數(shù)
        while((len=bis.read(buffer))!=-1){
            System.out.println(new String(buffer,0,len));
        }
        //關(guān)閉流資源
        bis.close();<br data-filtered="filtered"><br data-filtered="filtered">
        //字節(jié)緩沖輸出流
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream("io"+File.separator+"a.txt"));
        bos.write("ABCD".getBytes());
        bos.close();
//字符緩沖輸入流
        BufferedReader br = new BufferedReader(
                new FileReader("io"+File.separator+"a.txt"));
        char[] buffer = new char[10];
        int len = -1;
        while((len=br.read(buffer))!=-1){
            System.out.println(new String(buffer,0,len));
        }
        br.close();
        //字符緩沖輸出流
        BufferedWriter bw = new BufferedWriter(
                new FileWriter("io"+File.separator+"a.txt"));
        bw.write("ABCD");
        bw.close();

3、轉(zhuǎn)換流:把字節(jié)流轉(zhuǎn)換為字符流

InputStreamReader:把字節(jié)輸入流轉(zhuǎn)換為字符輸入流

OutputStreamWriter:把字節(jié)輸出流轉(zhuǎn)換為字符輸出流

用轉(zhuǎn)換流進(jìn)行文件的復(fù)制:

/**
         * 將 a.txt 文件 復(fù)制到 b.txt 中
         */
        //1、創(chuàng)建源和目標(biāo)
        File srcFile = new File("io"+File.separator+"a.txt");
        File descFile = new File("io"+File.separator+"b.txt");
        //2、創(chuàng)建字節(jié)輸入輸出流對象
        InputStream in = new FileInputStream(srcFile);
        OutputStream out = new FileOutputStream(descFile);
        //3、創(chuàng)建轉(zhuǎn)換輸入輸出對象
        Reader rd = new InputStreamReader(in);
        Writer wt = new OutputStreamWriter(out);
        //3、讀取和寫入操作
        char[] buffer = new char[10];//創(chuàng)建一個(gè)容量為 10 的字符數(shù)組,存儲已經(jīng)讀取的數(shù)據(jù)
        int len = -1;//表示已經(jīng)讀取了多少個(gè)字符,如果是 -1,表示已經(jīng)讀取到文件的末尾
        while((len=rd.read(buffer))!=-1){
            wt.write(buffer, 0, len);
        }
        //4、關(guān)閉流資源
        rd.close();
        wt.close();

4、內(nèi)存流(數(shù)組流):

把數(shù)據(jù)先臨時(shí)存在數(shù)組中,也就是內(nèi)存中。所以關(guān)閉 內(nèi)存流是無效的,關(guān)閉后還是可以調(diào)用這個(gè)類的方法。底層源碼的 close()是一個(gè)空方法

①、字節(jié)內(nèi)存流:ByteArrayOutputStream 、ByteArrayInputStream

//字節(jié)數(shù)組輸出流:程序---》內(nèi)存
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        //將數(shù)據(jù)寫入到內(nèi)存中
        bos.write("ABCD".getBytes());
        //創(chuàng)建一個(gè)新分配的字節(jié)數(shù)組。 其大小是此輸出流的當(dāng)前大小,緩沖區(qū)的有效內(nèi)容已被復(fù)制到其中。
        byte[] temp = bos.toByteArray();
        System.out.println(new String(temp,0,temp.length));
        byte[] buffer = new byte[10];
        ///字節(jié)數(shù)組輸入流:內(nèi)存---》程序
        ByteArrayInputStream bis = new ByteArrayInputStream(temp);
        int len = -1;
        while((len=bis.read(buffer))!=-1){
            System.out.println(new String(buffer,0,len));
        }
        //這里不寫也沒事,因?yàn)樵创a中的 close()是一個(gè)空的方法體
        bos.close();
        bis.close();

②、字符內(nèi)存流:CharArrayReader、CharArrayWriter

//字符數(shù)組輸出流
        CharArrayWriter caw = new CharArrayWriter();
        caw.write("ABCD");
        //返回內(nèi)存數(shù)據(jù)的副本
        char[] temp = caw.toCharArray();
        System.out.println(new String(temp));
        //字符數(shù)組輸入流
        CharArrayReader car = new CharArrayReader(temp);
        char[] buffer = new char[10];
        int len = -1;
        while((len=car.read(buffer))!=-1){
            System.out.println(new String(buffer,0,len));
        }

③、字符串流:StringReader,StringWriter(把數(shù)據(jù)臨時(shí)存儲到字符串中)

//字符串輸出流,底層采用 StringBuffer 進(jìn)行拼接
        StringWriter sw = new StringWriter();
        sw.write("ABCD");
        sw.write("帥鍋");
        System.out.println(sw.toString());//ABCD帥鍋
        //字符串輸入流
        StringReader sr = new StringReader(sw.toString());
        char[] buffer = new char[10];
        int len = -1;
        while((len=sr.read(buffer))!=-1){
            System.out.println(new String(buffer,0,len));//ABCD帥鍋
        }

5、合并流:把多個(gè)輸入流合并為一個(gè)流,也叫順序流,因?yàn)樵谧x取的時(shí)候是先讀第一個(gè),讀完了在讀下面一個(gè)流。

//定義字節(jié)輸入合并流
        SequenceInputStream seinput = new SequenceInputStream(
                new FileInputStream("io/a.txt"), new FileInputStream("io/b.txt"));
        byte[] buffer = new byte[10];
        int len = -1;
        while((len=seinput.read(buffer))!=-1){
            System.out.println(new String(buffer,0,len));
        }
        seinput.close();

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 簡單實(shí)現(xiàn)Java版學(xué)生管理系統(tǒng)

    簡單實(shí)現(xiàn)Java版學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了簡單實(shí)現(xiàn)Java版學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • java使用udp實(shí)現(xiàn)簡單多人聊天功能

    java使用udp實(shí)現(xiàn)簡單多人聊天功能

    這篇文章主要為大家詳細(xì)介紹了java使用udp實(shí)現(xiàn)簡單多人聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • SpringBoot實(shí)現(xiàn)EMQ設(shè)備的上下線告警

    SpringBoot實(shí)現(xiàn)EMQ設(shè)備的上下線告警

    EMQX?的上下線系統(tǒng)消息通知功能在客戶端連接成功或者客戶端斷開連接,需要實(shí)現(xiàn)設(shè)備的上下線狀態(tài)監(jiān)控,所以本文給大家介紹了如何通過SpringBoot實(shí)現(xiàn)EMQ設(shè)備的上下線告警,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-10-10
  • mybatis映射文件mapper.xml的具體寫法

    mybatis映射文件mapper.xml的具體寫法

    在開發(fā)過程中,需要開發(fā)人員配置mapper映射文件,本文主要介紹了mybatis映射文件mapper.xml的具體寫法,感興趣的可以了解一下
    2021-09-09
  • Java中的自旋鎖與適應(yīng)性自旋鎖詳解

    Java中的自旋鎖與適應(yīng)性自旋鎖詳解

    這篇文章主要介紹了Java中的自旋鎖與適應(yīng)性自旋鎖詳解,在多處理器環(huán)境中某些資源的有限性,有時(shí)需要互斥訪問,這時(shí)候就需要引入鎖的概念,只有獲取了鎖的線程才能對資源進(jìn)行訪問,多線程的核心是CPU的時(shí)間分片,所以同一時(shí)刻只能有一個(gè)線程獲取到鎖,需要的朋友可以參考下
    2023-10-10
  • 解讀為何java中的boolean類型是32位的

    解讀為何java中的boolean類型是32位的

    這篇文章主要介紹了為何java中的boolean類型是32位的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • mybatis 忽略實(shí)體對象的某個(gè)屬性(2種方式)

    mybatis 忽略實(shí)體對象的某個(gè)屬性(2種方式)

    這篇文章主要介紹了mybatis 忽略實(shí)體對象的某個(gè)屬性方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • springboot整合minio的超詳細(xì)教程

    springboot整合minio的超詳細(xì)教程

    在很多互聯(lián)網(wǎng)產(chǎn)品應(yīng)用中,都涉及到各種與文件存儲相關(guān)的業(yè)務(wù),隨著技術(shù)的發(fā)展,關(guān)于如何解決分布式文件存儲也有了比較成熟的方案,比如私有云部署下可以考慮fastdfs,阿里云對象存儲oss,七牛云等,本篇將為你介紹另一種文件存儲方式,即MinIO,需要的朋友可以參考下
    2023-12-12
  • struts2與cookie 實(shí)現(xiàn)自動登錄和驗(yàn)證碼驗(yàn)證實(shí)現(xiàn)代碼

    struts2與cookie 實(shí)現(xiàn)自動登錄和驗(yàn)證碼驗(yàn)證實(shí)現(xiàn)代碼

    這篇文章主要介紹了struts2與cookie 實(shí)現(xiàn)自動登錄和驗(yàn)證碼驗(yàn)證實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • 項(xiàng)目總結(jié)之HttpURLConnection的disconnect的問題

    項(xiàng)目總結(jié)之HttpURLConnection的disconnect的問題

    這篇文章主要介紹了項(xiàng)目總結(jié)之HttpURLConnection的disconnect的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評論

张家界市| 新邵县| 荃湾区| 寻乌县| 岳阳县| 开江县| 白朗县| 贡嘎县| 郁南县| 廊坊市| 自治县| 无棣县| 科技| 达州市| 固阳县| 罗甸县| 顺昌县| 巩留县| 临朐县| 海兴县| 阿巴嘎旗| 昌邑市| 泾阳县| 柘荣县| 贺州市| 石渠县| 米脂县| 浪卡子县| 石河子市| 六盘水市| 瑞丽市| 钟山县| 蛟河市| 岗巴县| 安顺市| 襄城县| 和田市| 梧州市| 沧州市| 通城县| 海兴县|