1. 程式人生 > >Java基礎—IO小結(二)大綱待更新

Java基礎—IO小結(二)大綱待更新

16px 文件復制 buffere tro 順序 -a [] 啟用 -c

一、緩沖流的使用

  每個字節流都有對應的緩沖流:

  技術分享

  BufferedInputStream / BufferedOutputStream

  構造器:

  技術分享

  技術分享

  方法摘要與對應節點流類似

  使用緩沖流實現文件復制:實際中也是

技術分享
    @Test
    public void testBuffered1() {
        // 同樣需要先關聯文件,註意文本使用Reader Writer,非文本使用fis fos
        File file1 = new File("D:\\test\\1.jpg");
        File file2 
= new File("D:\\test\\2.jpg"); BufferedInputStream bis = null; BufferedOutputStream bos = null; try { // 創建節點流 FileInputStream fis = new FileInputStream(file1); FileOutputStream fos = new FileOutputStream(file2); // 將節點流包裝為緩沖流
bis = new BufferedInputStream(fis); bos = new BufferedOutputStream(fos); // 準備緩沖的數組 byte[] bytes = new byte[20]; int len; while ((len = bis.read(bytes)) != -1) { bos.write(bytes, 0, len); // 寫完後將最後的進行刷新一下
bos.flush(); } } catch (IOException e) { e.printStackTrace(); } finally { // 關閉流,註意流的關閉順序,直接關閉緩沖流時,會自動先關閉對應節點流 if (bos != null) { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } if (bis != null) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } } }
View Code

  BufferedReader與BufferedWriter的使用也是與對應節點流類似

  演示獨有的readLine方法:

技術分享
    @Test
    public void testBufferedReader() {
        File file1 = new File("D:\\test\\hello.txt");
        BufferedReader br = null;
        try {
            FileReader fr = new FileReader(file1);
            br = new BufferedReader(fr);
            // 使用br獨有的讀行的操作
            String s = null;
            while ((s = br.readLine()) != null) {
                System.out.println(s);
            }

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

    }
View Code

  // 註意,讀取doc文檔需要使用字節流(即使文檔全部是文本組成,doc也已經不是純文本文件了)

二、轉換流的使用

  InputStreamReader / OutputStreamWriter

  JDK中的介紹如下:需要分清編碼與解碼的過程

技術分享
InputStreamReader 是字節流通向字符流的橋梁:它使用指定的 charset 讀取字節並將其解碼為字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平臺默認的字符集。

每次調用 InputStreamReader 中的一個 read() 方法都會導致從底層輸入流讀取一個或多個字節。要啟用從字節到字符的有效轉換,可以提前從底層流讀取更多的字節,使其超過滿足當前讀取操作所需的字節。

為了達到最高效率,可要考慮在 BufferedReader 內包裝 InputStreamReader。例如:

 BufferedReader in
   = new BufferedReader(new InputStreamReader(System.in));

OutputStreamWriter 是字符流通向字節流的橋梁:可使用指定的 charset 將要寫入流中的字符編碼成字節。它使用的字符集可以由名稱指定或顯式給定,否則將接受平臺默認的字符集。

每次調用 write() 方法都會導致在給定字符(或字符集)上調用編碼轉換器。在寫入底層輸出流之前,得到的這些字節將在緩沖區中累積。可以指定此緩沖區的大小,不過,默認的緩沖區對多數用途來說已足夠大。註意,傳遞給 write() 方法的字符沒有緩沖。

為了獲得最高效率,可考慮將 OutputStreamWriter 包裝到 BufferedWriter 中,以避免頻繁調用轉換器。例如:

 Writer out
   = new BufferedWriter(new OutputStreamWriter(System.out));
 
代理對 是一個字符,它由兩個 char 值序列表示:高 代理項的範圍為 ‘\uD800‘ 到 ‘\uDBFF‘,後跟範圍為 ‘\uDC00‘ 到 ‘\uDFFF‘ 的低 代理項。

錯誤代理元素 指的是後面不跟低代理項的高代理項,或前面沒有高代理項的低代理項。

此類總是使用字符集的默認替代序列 替代錯誤代理元素和不可映射的字符序列。如果需要更多地控制編碼過程,則應該使用 CharsetEncoder 類。
View Code

  技術分享

  解碼,解成我們能夠看得懂的,也就是解成字符串

  簡單示例如下:(不是特別重要,不作特別介紹這裏)

技術分享
 @Test
    public void test1() {
        File file = new File("D:\\test\\hello.txt");
        // 異常處理暫略
        FileInputStream fis = new FileInputStream(file);
        // 字節流到字符流的解碼
        InputStreamReader isr = new InputStreamReader(fis, "GBK");
        BufferedReader br = new BufferedReader(isr);
        String s;
        // 緩沖流的操作略去
    }
View Code

三、標準輸入輸出流

  技術分享

  也就是我們常見的Syetem.out/in

  接收用戶輸入使用示例:

技術分享
    @Test
    public void test1() {
        BufferedReader br = null;
        try {
            InputStream in = System.in;
            // 轉換成字符流
            InputStreamReader isr = new InputStreamReader(in);
            br = new BufferedReader(isr);
            String s;
            while (true) {
                System.out.println("請輸入字符串:");
                s = br.readLine();
                if ("exit".equalsIgnoreCase(s)) {
                    break;
                }
                String s1 = s.toUpperCase();
                System.out.println(s1);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
View Code

Java基礎—IO小結(二)大綱待更新