-------------siwuxie095
工程名:TestRWBufferedByteStream
包名:com.siwuxie095.bufferedbytestream
類名:ReadByBufferedByteStream.java
打開資源管理器,在工程 TestRWBufferedByteStream 文件夾下,放入
一部視頻:movie.avi
工程結構目錄如下:
代碼:
package com.siwuxie095.bufferedbytestream;
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;
public class ReadByBufferedByteStream {
/** * 帶有緩沖的字節流來讀寫數據,並實現文件的拷貝 * * 緩沖區的大小和字節數組的大小的優化將決定最終的拷貝效率 * 而緩沖區和字節數組的值根據文件的大小而變化,需要實際測試找到最優組合 * * 注意:緩沖區的大小肯定是要大於字節數組的大小的,因為 字節數組是從緩沖區 * 中讀取的,將緩沖區讀取完畢后,緩沖區才會從文件中讀取 * (此機制降低了磁盤讀寫次數,延長磁盤的使用壽命) * * @param args */
public static void main(String[] args) {
try {
//創建一個 FileInputStream 來獲取原始的字節輸入流 //傳入一個String:movie.avi,這是一個視頻文件,共 38 MB //文件比較大,因為這樣才能凸顯帶有緩沖的字節流在讀寫效率上的高效 //注意:有異常拋出,用 try catch 捕獲即可 FileInputStream fis=new FileInputStream("movie.avi");
//將 FileInputStream 包裝成一個帶有緩沖的 BufferedInputStream, //傳入文件輸入流 fis //還可以在指定文件輸入流 fis 的同時指定緩沖區的大小(單位:字節) //緩沖區的大小也會影響當前流的操作的效率,這里可以設為 1000KB //BufferedInputStream bis=new BufferedInputStream(fis); BufferedInputStream bis=new BufferedInputStream(fis,1000000);
//創建一個文件的輸出流,使用相對路徑 FileOutputStream fos=new FileOutputStream("movie_new.avi"); //再包裝成一個帶有緩沖的輸出流,傳入文件輸出流 fos, //設定緩沖區大小為 1000KB BufferedOutputStream bos=new BufferedOutputStream(fos,1000000);
//使用 BufferedInputStream 的 read()方法讀取數據 //並且是將數據讀取到一個字節數組中,所以先創建一個字節型數組 //將默認字節數組大小設置為100 //數組大小這個參數有待優化,根據需要復制的文件的大小而定, //不一定越大越好,也不一定越小越好 //原則:大型文件對應的數組大一些,小型文件對應的數組小一些 byte input[]=new byte[100];
//計數器 int count=0; //System.currentTimeMillis() 返回從1970年到當前時間的毫秒數 long before=System.currentTimeMillis();
//由於每次讀取的只是100字節,需要循環讀取 //這里 read()的返回值是整型,返回-1時讀取完畢 while (bis.read(input)!=-1) { //將input數組寫入到文件中 bos.write(input); count++;//計算讀取次數 }
//關閉流 先打開的后關閉 后打開的先關閉 bis.close(); fis.close(); bos.close(); fos.close();
long after=System.currentTimeMillis(); int time=(int) (after-before); System.out.println("耗時 "+time+" 毫秒"); //讀寫次數過高相當於 流 訪問了磁盤同樣的次數,對磁盤開銷相當大 //如果把字節數組變大(在100的基礎上變大,但不能過大),讀寫次數就會變少, //讀寫的速度也會相對增加 System.out.println("讀寫了: "+count+" 次");
} catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
} |
運行一覽:
(1)不指定緩沖區大小,字節數組大小為 100 字節
BufferedInputStream bis=new BufferedInputStream(fis);
BufferedOutputStream bos=new BufferedOutputStream(fos);
byte input[]=new byte[100];
(2)指定緩沖區大小為 1000 KB,字節數組大小為 100 KB
BufferedInputStream bis=new BufferedInputStream(fis,1000000);
BufferedOutputStream bos=new BufferedOutputStream(fos,1000000);
byte input[]=new byte[100000];
運行后,工程結構目錄一覽:
【made by siwuxie095】