- 緩沖流的優勢是:
BufferedInputStream: 輸入緩沖流:先從磁盤中將要讀取的內容放入到內存中,再一次性從內存中取出來,避免了讀一段取一段;
BufferedOutputStream: 輸出緩沖流:先將要輸出的內容放入到內存中,再一次性全都輸出。
- 緩沖流的構造函數:
public BufferedInputStream(InputStream in) { this (in, DEFAULT_BUFFER_SIZE); }
public BufferedInputStream(InputStream in, int size) { super (in); if (size <= 0 ) { throw new IllegalArgumentException("Buffer size <= 0" ); } buf = new byte [size]; }
public BufferedOutputStream(OutputStream out) { this (out, 8192 ); }
public BufferedOutputStream(OutputStream out, int size) { super (out); if (size <= 0 ) { throw new IllegalArgumentException("Buffer size <= 0" ); } buf = new byte [size]; }
- 緩沖流關閉:
只需將緩沖流關閉,無需將節點流關閉,因為緩沖流內部會自動調用節點流關閉。
- 緩沖流需要調用flush()方法才能將內容輸入或輸出出來,或者調用close()方法時,也會調用flush()方法。
- 注意:
new FileOutputStream("***"); 如果參數中的路徑有目錄不存在,並不會自動創建目錄;
此外:調用File 類的mkdir()或mkdirs()可能出現錯誤“Access is denied”,暫時還沒解決。
- 緩沖流的應用
public class BufferedStream { public static void main(String[] args) { //BufferedStream fbs = new BufferedStream(); // fbs.writeFileWithBufferedStream("HelloBufferedOutputStream", // "/home/rding/bufferd.txt"); // fbs.readFileWithBufferedStream("/home/rding/bufferd.txt"); //fbs.writeFileWithBufferedStream("HelloWorld", "d:/rding/rding/buffered.txt"); String str = "c:\\cc\\cc"; System.out.println(str.lastIndexOf("\\")); } public void readFileWithBufferedStream(String srcPath, int size) { InputStream inputStream = null; BufferedInputStream bufferedInputStream = null; StringBuffer sb = new StringBuffer(); try { inputStream = new FileInputStream(srcPath); bufferedInputStream = new BufferedInputStream(inputStream); byte[] byteArr = new byte[size]; int len = 0; while ((len = bufferedInputStream.read(byteArr)) != -1) { sb.append(new String(byteArr), 0, len); } System.out.println(sb); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (bufferedInputStream != null) { try { bufferedInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } public void readFileWithBufferedStream(String srcPath) { InputStream inputStream = null; BufferedInputStream bufferedInputStream = null; try { inputStream = new FileInputStream(srcPath); bufferedInputStream = new BufferedInputStream(inputStream); int size = bufferedInputStream.available(); byte[] byteArr = new byte[size]; bufferedInputStream.read(byteArr); String str = new String(byteArr); System.out.println(str); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (bufferedInputStream != null) { try { bufferedInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } public void writeFileWithBufferedStream(String content, String destPath) { OutputStream outputStream = null; BufferedOutputStream bufferedOutputStream = null; try { // 下面的語句中,如果destPath中的目錄不存在,不會自動創建目錄,因此,建議使用下面的代碼 // outputStream = new FileOutputStream(destPath); // 前提是輸出的路徑是"/"而不是"\\"
File tmp = new File(destPath.substring(0, destPath.lastIndexOf("/"))); if(!tmp.exists()){ tmp.mkdirs(); } outputStream = new FileOutputStream(destPath); bufferedOutputStream = new BufferedOutputStream(outputStream); byte[] byteArr = content.getBytes(); bufferedOutputStream.write(byteArr); bufferedOutputStream.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (bufferedOutputStream != null) { try { bufferedOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } public void copyFileWithBufferedStream(String srcPath, String destPath, int size) { InputStream inputStream = null; BufferedInputStream bufferedInputStream = null; OutputStream outputStream = null; BufferedOutputStream bufferedOutputStream = null; try { inputStream = new FileInputStream(srcPath); // 下面的語句中,如果destPath中的目錄不存在,不會自動創建目錄,因此,建議使用下面的代碼 // outputStream = new FileOutputStream(destPath); File tmp = new File(destPath.substring(0, destPath.lastIndexOf("/"))); if(!tmp.exists()){ tmp.mkdirs(); } outputStream = new FileOutputStream(tmp); bufferedInputStream = new BufferedInputStream(inputStream); bufferedOutputStream = new BufferedOutputStream(outputStream); byte[] byteArr = new byte[size]; int len = 0; while ((len = bufferedInputStream.read(byteArr)) != -1) { bufferedOutputStream.write(byteArr, 0, len); } bufferedOutputStream.flush(); } catch (IOException e) { e.printStackTrace(); } finally { if (bufferedOutputStream != null) { try { bufferedOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (bufferedInputStream != null) { try { bufferedInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }