1.處理流/包裝流(相對於節點流更高級)裝飾設計模式/包裝模式
1:隱藏了底層的節點流的差異,並對外提供了更方便的輸入/輸出功能,讓我們只關心高級流的操作.2:使用處理流包裝了節點流,程序直接操作處理流,讓節點流與底層的設備做IO操作.
3:只需要關閉處理流即可.
包裝流如何區分:寫代碼的時候,發現創建對象對象的時候,需要傳遞另一個流對象.
new 包裝流( 流對象 ) ;
-----------------------------------------------------------
什麼是緩衝流:
是一個包裝流,目的起緩衝作用.
BufferedInputStream:
BufferedOutputStream:
BufferedReader:
BufferedWriter:
緩衝流的目的:
操作流的時候,習慣定義一個byte/char數組.
int read():每次都從磁盤文件中讀取一個字節. 直接操作磁盤文件性能極低.
解決方案: 定義一個數組作爲緩衝區.
byte[] buffer = new byte[1024]; 該數組其實就是一個緩衝區.
一次性從磁盤文件中讀取1024個字節. 如此以來,操作磁盤文件的次數少了,---->性能得以提升.
既然我們都能想到,SUN公司早就想到了,提供的默認緩存區大小是8192(1024*8),我們一般不用修改大小.
字節緩衝流複製案例:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class IODemo4 {
public static void main(String[] args) {
//這裏我使用了JDK1.7新特性:自動關閉資源,將資源的創建放到try語句的()中,資源使用完畢之後會自動關閉,不用我們手動釋放
try
(
//創建源
InputStream in = new BufferedInputStream(new FileInputStream("a.txt"));
//創建目標
OutputStream out = new BufferedOutputStream(new FileOutputStream("aCopy.txt"));
)
{
byte[] by =new byte[1024];
int len=0;
while ((len=in.read(by))!=-1) {
out.write(by, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
字符緩衝流複製案例:字符緩衝中有新的方法,想要使用這些方法就不能使用面向接口編程,就要直接創建它的對象
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
public class IODemo5 {
public static void main(String[] args) {
//這裏我使用了JDK1.7新特性:自動關閉資源,將資源的創建放到try語句的()中,資源使用完畢之後會自動關閉,不用我們手動釋放
try
(
//創建源
BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
//創建目標
BufferedWriter writer = new BufferedWriter(new FileWriter("fileCopy.txt"));
)
{
String len = null;
while ((len=reader.readLine())!=null) { //讀取一行
writer.write(len); //寫出一行
writer.newLine(); //換行
}
} catch (Exception e) {
e.printStackTrace();
}
}
}