java的IO之包裝流和緩存流

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章