文件流之字節緩沖流(BufferedInputStream BufferedOutputStream)


  • 緩沖流的優勢是: 

  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();
                }
            }
        }

    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM