### 簡單的說明
一般小的字節(byte)文件的讀取和寫入數據,我們使用FileInputStream和FileOutputStream類就可以實現了,但是對于大的字節(byte)文件的讀取和寫入數據,性能就會有很大的問題,我們一般選擇BufferedInputStream和BufferedOutputStream來處理,也就是說BufferedInputStream和BufferedOutputStream主要的目的是提高字節(byte)文件的內容讀取和寫入的性能。
### BufferedInputStream和BufferedOutputStream
### BufferedInputStream類
構造方法:
BufferedInputStream(InputStream in)
創建一個有32字節的緩存區
BufferedInputStream(InputStream in, int size)
創建一個有size大小字節的緩存區
關鍵方法:
read()
read(byte[] buffer, int byteOffset, int byteCount)
常用使用方式:
~~~
BufferedInputStream buf = new BufferedInputStream(new FileInputStream("file.java"));
~~~
### BufferedOutputStream類
構造方法:
BufferedOutputStream(OutputStream out)
BufferedOutputStream(OutputStream out, int size)
關鍵方法:
write(int oneByte)
write(byte[] buffer, int offset, int length)
flush()
主要是用來把緩存區的數據刷新到文件中去
常用使用方式:
~~~
BufferedOutputStream buf = new BufferedOutputStream(new FileOutputStream("file.java"));
~~~
### 一個測試的Demo
定義三個方法:
(1)testBufferedInputStream方法—讀取文件內容
BufferedInputStream的使用方法:
~~~
//1.創建一個輸入字符文件
//2.定義一個輸入流FileInputStream
//3.定義一個BufferedInputStream
//4.輸入操作
//5.關閉對應的流,注意,可以只關閉最外面的流
~~~
(2)testBufferedOutputStream方法—-往文件寫內容
BufferedOutputStream的使用方法:
~~~
//1.創建一個File文件
//2.定義一個輸出流
//3.定義一個BufferedOutputStream
//4.輸出操作
//5.關閉對應的流,注意,可以只關閉最外面的流
~~~
(3)copyFile方法—-復制文件的方法
~~~
//1.定義輸入和輸出的文件
//2.定義二個輸入輸出流
//3.定義二個輸入輸出緩存流
//4.實現復制功能
//5.關閉對應的流,緩存流的時候,可以只關閉對應的緩存流就可以,先關輸出緩存流,再關輸入緩存流
~~~
~~~
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedInputStreamBufferedOutputStream {
//使用BufferedInputStream和BufferedOutputStream,實現文件的復制功能
public static void copyFile(String src,String des,int lenByte){
//3.定義二個輸入輸出緩存流
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
//1.定義輸入和輸出文件
File fin = new File(src);
File fout = new File(des);
//2.定義二個輸入輸出流
FileInputStream fis = new FileInputStream(fin);
FileOutputStream fos = new FileOutputStream(fout);
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
//4.實現復制功能
byte[] b = new byte[lenByte];
int len;
while((len = bis.read(b))!= -1){
bos.write(b, 0, len);
bos.flush();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//5.關閉對應的流,緩存流的時候,可以只關閉對應的緩存流就可以,先關輸出緩存流,再關輸入緩存流
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//BufferedOutputStream使用樣例
public static void testBufferedOutputStream(){
//3.定義一個BufferedOutputStream
BufferedOutputStream bos = null;
try {
//1.定義輸出File
//File fin = new File("music_01.mp3");
File fout = new File("BufferedOutputStream.txt");
//2.定義一個輸出流
FileOutputStream fos = new FileOutputStream(fout);
bos = new BufferedOutputStream(fos);
//4.輸出操作
String str = "BufferedOutputStream使用樣例";
bos.write(str.getBytes());
fos.flush();
}catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally{
//5.關閉對應的流,注意,可以只關閉最外面的流
if(bos != null){
try {
bos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//BufferedInputStream使用樣例
public static void testBufferedInputStream(){
//3.定義一個BufferedInputStream
BufferedInputStream bis = null;
try {
//1.定義輸入File
//File fin = new File("music_01.mp3");
File fin = new File("hello.txt");
//2.定義一個輸入流
FileInputStream fis = new FileInputStream(fin);
bis = new BufferedInputStream(fis);
//4.輸入操作
byte[] b = new byte[16];
int len;
while((len = bis.read(b)) != -1){
System.out.println(new String(b, 0,len));
}
}catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally{
//5.關閉對應的流,注意,可以只關閉最外面的流
if(bis != null){
try {
bis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
~~~
調用:
~~~
//BufferedInputStream使用樣例
BufferedInputStreamBufferedOutputStream.testBufferedInputStream();
//BufferedOutputStream使用樣例
BufferedInputStreamBufferedOutputStream.testBufferedOutputStream();
//使用BufferedInputStream和BufferedOutputStream,實現文件的復制功能
long t1 = System.currentTimeMillis();
BufferedInputStreamBufferedOutputStream.copyFile("music_01.mp3","music_02.mp3",1024);//10M大小的音樂
long t2 = System.currentTimeMillis();
System.out.print("復制文件消耗的時間:"+(t2 - t1));//10-4437 100-431 1024-60
~~~
說明:
測試來復制一個10M大小的音樂文件(music_01.mp3),使用緩存流在一次復制10byte時要4437毫秒,一次復制100byte時要431毫秒,一次復制1024byte時要60毫秒。
參考資料:
1.BufferedOutputStream api文檔
android_sdk_docs_offline/reference/java/io/BufferedOutputStream.html
2.BufferedInputStream文檔
android_sdk_docs_offline/reference/java/io/BufferedInputStream.html
3.BufferedOutputStream與BufferedInputStream視頻
[http://edu.csdn.net/course/detail/805/10967?auto_start=1](http://edu.csdn.net/course/detail/805/10967?auto_start=1)
- 前言
- Java核心技術之Comparator和Comparable在排序中的應用
- Java核心技術之容器
- Java核心技術之基本數據類型
- java核心技術之正則表達式
- java核心技術之reflect(一):一個系統學習reflect的Demo(精)
- java核心技術之IO流(一)File類
- java核心技術之IO流(二)FileInputStream和FileOutputStream
- java核心技術之IO流(三)FileReader和FileWriter
- java核心技術之IO流(四)BufferedInputStream和BufferedOutputStream
- java核心技術之IO流(五)BufferedReader和BufferedWriter
- java核心技術之IO流(六)DataInputStream和DataOutputStream