Java基礎—IO小結(二)大綱待更新
阿新 • • 發佈:2017-09-09
16px 文件復制 buffere tro 順序 -a [] 啟用 -c
一、緩沖流的使用
每個字節流都有對應的緩沖流:
BufferedInputStream / BufferedOutputStream
構造器:
方法摘要與對應節點流類似
使用緩沖流實現文件復制:實際中也是
@Test public void testBuffered1() { // 同樣需要先關聯文件,註意文本使用Reader Writer,非文本使用fis fos File file1 = new File("D:\\test\\1.jpg"); File file2View Code= 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(); } } } }
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小結(二)大綱待更新