java自學之路-----字符流 字節流 緩衝流 轉換流


輸入輸出{

數據的輸入輸出時針對內存而言

外設----->內存:輸入流,進行讀的行爲

內存----->外設:輸出流,進行寫的行爲

}


字符流{

定義:字節流讀取文字字節數據後,不直接進行操作,而是先查詢指定的編碼表獲取對應文字,再對這個文字進行操作

:字符流  =   字節流  +  編碼表

對象類:Reader Writer

FileWriter{

用法:創建一個文件流輸出對象,構造方法要明確數據路徑以及文件名

注意:如果該文件存在則覆蓋,如果不存在,則進行創建

常用方法{

void write(“ ”) 接收字符串數據寫入緩衝區中

void flush( ) 進行刷新,將緩衝區數據寫入目的地中

void close( ) 關閉該文件流,在關閉之前會自動調用一次刷新方法。如果關閉流之後對該再進行操作就會拋出異常

}


FileReader{

用法:創建一個文件流輸入對象,要明確被讀取的文件目標

常用方法{

int read( ) 從文件讀取一個字符,並返回該字符的ASCII

int read(數組引用) 將讀到的數據存入該數組,並返回讀取的字符個數

}

}


三個小練習{

public class FileWriterDemo {
	public static void main(String[] args) throws IOException{
		//創建流對象
		FileWriter fw = new FileWriter("f:\\ab.txt");
		//對該文件進行寫操作
		fw.write("gsgsdfhdsfh"+System.getProperty("line.separator")+"sdfsdf");
		//關閉該流
		fw.close();				
	}	
}


public class FileReaderDemo {
	private static final int BUFF = 1024;
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		//創建一個輸入流對象,明確源
		FileReader fr = new FileReader("f:\\ab.txt");
		//對該文件進行寫的操作
		//	利用循環。將該文件所有數據讀取,	
		//一個一個讀取
//						int ch = 0;
//						while((ch=fr.read()) != -1){
//							System.out.print((char)ch);
//						}
		//按數組讀取
						char[] buf = new char[BUFF];
						int len = 0;
						while((len=fr.read(buf)) != -1){
							System.out.print(new String(buf, 0, len));
						}					
		//關閉該輸入流
		fr.close();	
	}
}

package io.test;
public class CopyFileDemo {
	private static final int BUFF = 1024;
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		//創建一個輸入文件流和一個輸出文件流
		FileReader fr = new FileReader("f:\\ab.txt");
		FileWriter fw = new FileWriter("f:\\ab_copy.txt");
		//利用循環對該文件進行讀,在寫到另一個文件
		char[] buf = new char[BUFF];
		int len = 0;
		while((len=fr.read(buf)) != -1){
			fw.write(new String(buf, 0, len));
		}
		fr.close();
		fw.close();
	}
}

}


緩衝流{

BufferedWriter{

作用:創建緩衝區對象並與被緩衝的流對象相關聯,以提高寫入效率

原理:先將數據轉入緩衝區,再一起將其轉入目的地

常用方法{

void write( ) 將數據寫入緩衝區中

void flush( ) 將緩衝區數據寫入關聯的文件

void close( ) 關閉緩衝區,同時將關聯的流一併關閉

void newLine( ) 寫入一個行分隔符(即換行)

}

}

BufferedReader{

作用:用作讀文件的緩衝區

常用方法:

string readLine( ) 讀取文件的行,補包含換行符(即讀到換行符停止)

}


練習{

//利用緩衝流的新方法readLine
		String line = null;
		while((line=br.readLine()) != null){
			bw.write(line);		
			bw.newLine();
		}

//自定義一個緩衝流
public class MyBufferedReader {
	private Reader r = null;
	private char[] buff = new char[1024];
	private int count = 0;
	private int pos = 0;
	
	public MyBufferedReader(Reader r){
		this.r = r;	
	}
	
	public int myRead() throws IOException{
		if(count == 0){
			count = r.read(buff);
			pos = 0;
		}
		if(count == -1)
			return -1;
		count--;
		return buff[pos++];
	}
	public String myReadLine() throws IOException{
		StringBuffer sb = new StringBuffer();
		int ch = 0;
		while((ch=myRead()) != -1){
			if(ch == '\r')
				continue;
			if(ch == '\n')
				return sb.toString();
			sb.append((char)ch);				
		}
		if(sb.length() != 0)
			return sb.toString();
		return null;		
	}
}

}

}

}


字節流{

定義;基本操作思想與字符流相同,只不過單元不同

對象類:InputStream OutputStream(write,直接把數據寫入目的地,不需要flush)

FileInputStream 有一個獨特的方法 int available() 返回該輸入文件流綁定的文件的大小

}


轉換流{

InputStreamReader 將字節流轉換爲字符流,以便使用字符流的方法,需要將字節流對象作爲構造參數傳入

OutputStreamWriter 將字符流轉換回字節流,需要將字節流對象作爲構造參數傳入

練習

//將鍵盤上輸入的信息,在控制檯輸出
public class KeyboardInputDemo {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		InputStream in = System.in;
		//將字節流轉換爲字符流來使用
		InputStreamReader isr = new InputStreamReader(in);
		//爲了高效加入緩衝流
		BufferedReader br = new BufferedReader(isr);
		
		OutputStream out = System.out;
		//爲了將接受到的字符流輸出到控制檯,就必須轉換成字節流
		OutputStreamWriter osw = new OutputStreamWriter(out);
		//同樣,爲了高效,加入緩衝流
		BufferedWriter bw = new BufferedWriter(osw);
		
		String line = null;
		line = br.readLine();
		bw.write(line);
		bw.flush();		
	}
}

}


總結{

1.明確源和目的

源: InputStream Reader

目的: OutputStream Writer

2.明確數據類型

源:是文本數據: InputStream 不是 Reader

目的:是文本數據:OutputStream 不是 Writer

3.明確具體設備

源: 硬盤:  File類型的流       鍵盤: System.in 內存: 數組    網絡:Socket流

目的: 硬盤:  File類型的流       鍵盤: System.in 內存: 數組    網絡:Socket流

4.明確是否需要其他額外功能

需要高效: 緩衝流BufferedReader BufferedWriter

需要轉換: 轉換流InputStreamReader OutputSteamWriter

FileWriter 其實就是轉換流制定了本機默認碼錶的體現,而且這個轉換流的子類對象可以方便操作文本文件

即:文件字符流 = 文件字節流 + 轉換流 + 默認編碼表

注意{

轉換流在源或目的對應的設備是字節流的,但是操作的是文本數據的時候使用

只有轉換流能指定編碼表(InputstreamReader OutputStreamWriter)

}

}


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