IO流(2)緩衝流:增強型字節流、字符流

一、緩衝流概述

是對前面學習的4個基礎的字節字符流的增強

  • FileOutputStream
  • FileInputStream
  • FileWriter
  • FIleReader

1. 緩衝流的基本原理

  • 1.使用底層流對象從具體設備上獲取數據,並將數存儲到緩衝區的數據內
  • 2.通過緩衝區的read()方法從緩衝區獲取具體的字符數據,這樣就提高了效率
  • 3.如果用read方法讀取字符數據,並存儲到另一個容器,直到讀取到了換行符時,將另一個容器臨時存儲的數據轉換爲字符串返回,就形成了readLine()方法

綜上,也就是說,在創建流對象的時候,會創建一個內置的默認大小的緩衝區數組,通過緩衝區讀寫,減少系統IO次數,從而提高讀寫效率

緩衝流的命名規律是BufferedXXX

  • 字節緩衝流:BufferedInputStream,BufferedOutputStream
  • 字符緩衝流:BufferedWriter,BufferedReader

二、字節緩衝流

1. 構造方法

  • public BufferedInputStream(InputStream in):創建一個新得緩衝輸入流、注意參數類型是InputStream
  • public BufferedOutputStream(OutputStream out):創建一個新得緩衝輸出流,注意參數類型是OutputStream

常見寫法

public class Buffered_Demo01 {
    public static void main(String[] args) throws FileNotFoundException {
        //0. 方式一
        FileInputStream fis = new FileInputStream("b.txt");
        BufferedInputStream bis = new BufferedInputStream(fis);

        //1. 方式二
        BufferedInputStream bis2 = new BufferedInputStream(new FileInputStream("c.txt"));

        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("d.txt"));

    }
}

2. 緩衝流的高效性(緩衝流實現大文件的複製)

  • 緩衝流的讀寫方法和普通的基本一致,下面通過複製一個大文件來對比普通字節流和緩衝流的區別

  • 文件信息
    在這裏插入圖片描述

  • 普通字節流複製文件

public class Buffered_Demo02 {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        //0. 聲明 字節輸入流輸出流
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            //1. 創建輸入流
            fis = new FileInputStream("D:\\IO流學習\\test.mkv");
            //2. 創建輸出流
            fos = new FileOutputStream("D:\\IO流學習\\test_copy.mkv");
            //3. 創建大小爲1MB的字節數組
            byte[] b = new byte[1024];
            int len;
            while ((len = fis.read(b)) != -1){
                fos.write(b,0,len);
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                fis.close();
                fos.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        System.out.println("普通流複製300M文件耗時:" + (System.currentTimeMillis() - start));
    }
}
  • 緩衝流複製文件
public class Buffered_Demo03 {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        //0. 聲明 字節緩衝輸入流輸出流
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            //1. 創建緩衝輸入流
            bis = new BufferedInputStream(new FileInputStream("D:\\IO流學習\\test.mkv"));
            //2. 創建緩衝輸出流
            bos = new BufferedOutputStream(new FileOutputStream("D:\\IO流學習\\test_copy02.mkv"));
            //3. 創建大小爲1MB的字節數組
            byte[] b = new byte[1024];
            int len;
            while ((len = bis.read(b)) != -1){
                bos.write(b,0,len);
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            try {
                bis.close();
                bos.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        System.out.println("緩衝流複製300M文件耗時:" + (System.currentTimeMillis() - start));
    }
}
  • 耗時對比
    在這裏插入圖片描述

三、字符緩衝流

1. 構造方法

格式和原理與字節緩衝流完全一致

  • public BufferedReader(Reader in):創建一個新的緩衝輸入流,注意參數類型爲Reader
  • public BufferedWriter(Writer out):創建一個新的緩衝輸出流,注意參數類型爲Writer

2. 字符緩衝流特有方法(readLine()/writeLine())

基本的讀寫方法和普通字符流完全一致

  • BufferedReader:public String readLine()按行讀取數據,讀到最後返回null
  • BufferedWriter:public void newLine()換行,由系統屬性定義符號

2.1 readLine()

public class Buffered_Demo04 {
    public static void main(String[] args) throws IOException {
       //0. 創建緩衝字符輸入流
        BufferedReader br = new BufferedReader(new FileReader("D:\\IO流學習\\a.txt"));
        //1. 定義暫存字符串
        String line = null;
        while ((line = br.readLine()) != null){
            System.out.print(line);
            System.out.println();
        }
    }
}
  • 輸出
    在這裏插入圖片描述

2.2 newLine()

public class Buffered_Demo05 {
    public static void main(String[] args) throws IOException {
       //0. 創建緩衝字符輸入流
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\IO流學習\\a.txt"));
        bw.write("換行");
        bw.newLine();
        bw.write("寫入");
        bw.newLine();
        bw.write("是可以的");
        bw.close();
    }
}
  • 輸出
    在這裏插入圖片描述

3. 緩衝字符流實現對文本的排序

public class Buffered_Demo06 {
    public static void main(String[] args) throws IOException {
        Map<String, String> map = new HashMap<>();
        //0. 創建緩衝字符輸入流
        BufferedReader br = new BufferedReader(new FileReader("D:\\IO流學習\\unSorted.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\IO流學習\\Sorted.txt"));
        //1. 讀取數據
        String line = null;
        while ((line = br.readLine()) != null){
            //1.1 按 . 作爲分割符
            String[] split = line.split("\\.");
            map.put(split[0],split[1]);
        }
        br.close();
        //2. 遍歷map集合
        for (int i = 1; i <= map.size(); i++) {
            String key = String.valueOf(i);
            //2.1 獲取文本
            String value = map.get(key);
            //2.2 拼接寫入
            bw.write(key + "." + value);
            //2.3 換行
            bw.newLine();
        }
        bw.close();
    }
}
  • 輸出
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章