使用帶有緩沖的字節流讀寫數據


-------------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 來獲取原始的字節輸入流

//傳入一個Stringmovie.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】


免責聲明!

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



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