【Java IO流】緩衝流

IO流 處理流之一:緩衝流

  • 爲了提高數據讀寫的速度,Java API提供了帶緩衝功能的流類,在使用這些流類 時,會創建一個內部緩衝區數組,缺省使用8192個字節(8Kb)的緩衝區在這裏插入圖片描述
  • 緩衝流要“套接”在相應的節點流之上,根據數據操作單位可以把緩衝流分爲:
    • BufferedInputStreamBufferedOutputStream
    • BufferedReaderBufferedWriter
  • 當讀取數據時,數據按塊讀入緩衝區,其後的讀操作則直接訪問緩衝區
  • 當使用BufferedInputStream讀取字節文件時,BufferedInputStream會一次性從 文件中讀取8192個(8Kb),存在緩衝區中,直到緩衝區裝滿了,才重新從文件中 讀取下一個8192個字節數組。
  • 向流中寫入字節時,不會直接寫到文件,先寫到緩衝區中直到緩衝區寫滿, BufferedOutputStream纔會把緩衝區中的數據一次性寫到文件裏。使用方法 flush()可以強制將緩衝區的內容全部寫入輸出流
  • 關閉流的順序和打開流的順序相反。只要關閉最外層流即可,關閉最外層流也 會相應關閉內層節點流
  • flush()方法的使用:手動將buffer中內容寫入文件
  • 如果是帶緩衝區的流對象的close()方法,不但會關閉流,還會在關閉流之前刷 新緩衝區,關閉後不能再寫出

使用緩衝流 BufferedInputStream、BufferedOutputStream實現非文本文件(圖片、mp3、mp4等)的複製
Demo:

@Test
    public void BufferedStreamTest(){

        BufferedInputStream bufferedInputStream = null;
        BufferedOutputStream bufferedOutputStream = null;

        try {
            //1.創建File類的對象,指明讀入和寫出的文件
            File srcFile = new File("愛情與友情.mp4");
            File destFile = new File("愛情與友情2.mp4");

            //2.創建輸入流和輸出流的對象(造節點流)
            FileInputStream fileInputStream = new FileInputStream(srcFile);
            FileOutputStream fileOutputStream = new FileOutputStream(destFile);

            //3.創建緩衝流對象(造緩衝流)
            bufferedInputStream = new BufferedInputStream(fileInputStream);
            bufferedOutputStream = new BufferedOutputStream(fileOutputStream);

            //3.數據的讀入和寫出的操作
            byte[] buffer = new byte[1024];
            int len;
            while ((len = bufferedInputStream.read(buffer)) != -1 ){
                bufferedOutputStream.write(buffer,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.資源關閉
            //要求:先關閉外層的流,再關閉內層的流
            //說明:關閉外層流的同時,內層流也會自動的進行關閉。關於內層流的關閉,我們可以省略.
            if (bufferedOutputStream != null){
                try {
                    bufferedOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (bufferedInputStream != null){
                try {
                    bufferedInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

使用BufferedReader和BufferedWriter實現文本文件的複製
Demo:

 @Test
    public void testBufferedReaderBufferedWriter() throws IOException {

        //1.創建File類的對象,指明讀入和寫出的文件
        File srcFile = new File("dbcp.txt");
        File destFile = new File("dbcp1.txt");

        //2.創建輸入流和輸出流的對象(造節點流)
        FileReader fileReader = new FileReader(srcFile);
        FileWriter fileWriter = new FileWriter(destFile);

        //3.創建緩衝流對象(造緩衝流)
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);

        //4.數據的讀入和寫出的操作
        char[] buffer = new char[8];
        int len;
        while ((len = bufferedReader.read(buffer)) != -1){
            bufferedWriter.write(buffer, 0, len);
        }
        //5.資源關閉
        bufferedWriter.close();
        bufferedReader.close();
    }
    @Test
    public void testBufferedReaderBufferedWriter1() throws IOException {

        //創建文件和相應的流
        BufferedReader bufferedReader = new BufferedReader(new FileReader(new File("dbcp.txt")));
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(new File("dbcp2.txt")));
        
        //方式二:使用String
        String data;
        while ((data = bufferedReader.readLine()) != null){
            //bufferedWriter.write(data+"\n");
            bufferedWriter.write(data);
            bufferedWriter.newLine();
        }
        bufferedWriter.close();
        bufferedReader.close();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章