Java中的IO流知識詳解整理

好記性不如爛筆頭,這是我學習編程以來,最大的感受,無論你曾經多麼的優秀,如果你沒有一個良好的複習體系,那麼你是很難學好一門技術的,甚至其他領域。

IO

IO指的是input和output

IO流是解決設備與設備之間的傳輸問題 比如:硬盤到內存,內存到硬盤

其中,input指的是輸入,是輸入內存。output指的是輸出,是輸出內存。簡單來說就是input讀取文件,output寫文件,其實我更願意通過內存來理解。

inputstream和outputstream

inputstream是字節輸入流,能夠讀取流中的字節寫入到內存中

outputstream是字節輸出流,能夠將流中的字節寫出到內存去


public class Test {
	public static void main(String [] args ) throws Exception {
		//將文件實例化爲一個對象
		File f1 = new File("ceshi.txt");
		File f2 = new File("ceshi2.txt");
		//將輸入流與文件輸入流綁定、輸出流綁定
		InputStream is = new FileInputStream(f1);
		OutputStream os = new FileOutputStream(f2);
		//將輸入流讀到的字節數存到一個字節數組中去
		byte[] bitArr = new byte[1024];
		is.read(bitArr);
		//將讀好的字節數組寫到另外一個文件裏面去
		os.write(bitArr);
		//最後要把流關閉
		is.close();
		os.close();
	}
}
//測試結果:將ceshi.txt文件的內容寫到了ceshi2.txt中去。

Bufferedinputstream 和 BufferedOutputstream

Bufferedinputstream——緩衝輸入字節流

BufferedOutputstream——緩衝輸出字節流


public class Test {
	public static void main(String [] args ) throws Exception {
		//將文件實例化爲一個對象
		File f1 = new File("ceshi.txt");
		File f2 = new File("ceshi2.txt");
		//將輸入流與文件輸入流綁定、輸出流綁定
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f1));
		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(f2));
		//讀取字節數據到一個數組文件中
		byte [] arr = new byte[1024*10];
		bis.read(arr);
		//將讀取到的字節數組文件寫到另一個文本上
		bos.write(arr);
		//關閉流
		bis.close();
		bos.close();
	}
}

Reader和Writer

reader——字符輸入流

writer——字符輸出流


public class Test {
	public static void main(String [] args ) throws Exception {
		//將文件實例化爲一個對象
		File f1 = new File("ceshi.txt");
		File f2 = new File("ceshi2.txt");
		//將輸入流與文件輸入流綁定、輸出流綁定
		Reader r = new FileReader(f1);
		Writer w = new FileWriter(f2);
		//讀數據
		char[] arr = new char[1024*10];
		r.read(arr);
		//寫數據
		w.write(arr);
	}
}

bufferedreader和bufferedwriter

bufferedreader——字符輸入緩存流

bufferedwriter——字符輸出緩存流

與上面所不同的是,除了能讀單個,讀多個,這個流還有擴展的方法,能夠一次性讀取一行,但是他在寫的時候不會自動換行,需要nextLine()方法手動
在這裏插入圖片描述

public class Test {
	public static void main(String [] args ) throws Exception {
		//將文件實例化爲一個對象
		File f1 = new File("ceshi.txt");
		File f2 = new File("ceshi2.txt");
		//將輸入流與文件輸入流綁定、輸出流綁定
		BufferedReader br = new BufferedReader(new FileReader(f1));
		BufferedWriter bw = new BufferedWriter(new FileWriter(f2));
		//讀取一行
		String s ="";
		while((s = br.readLine())!= null ) {
			bw.write(s);
			bw.newLine();
		}
		//結束流
		br.close();
		bw.close();
	}
}

InputstreamReader和OutputstreamReader

inputstreamreader 可以從輸入流中讀取原始的字節,根據指定的編碼形式,將字節轉換成Unicode字符

outputstreamwrite 可以從輸出流中接收Unicode字符,通過指定的編碼形式轉換成字節,再將這些字節寫入底層輸出流

讀字節流,輸出字符流

	//將文件實例化爲一個對象
		File f1 = new File("ceshi.txt");
		File f2 = new File("ceshi2.txt");
		//bufferedreader讀取的是字符流,如果想用文件讀字節再變成字符的話,需要通過inputstream轉換
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f1)));
		//bufferedwriter 寫的是字符流,可以直接將剛剛讀到的字符流寫入。
		BufferedWriter bw = new BufferedWriter(new FileWriter(f2));
		//讀數據
		String src = null ;
		while((src = br.readLine())!=null) {
			bw.write(src);
			bw.newLine();
			bw.flush();
		}
		//關流
		br.close();
		bw.close();

讀字符流,輸出字節流
注意不要以爲所有帶Reader/Writer後綴的都是與字節流無關

建議翻看JDK API

		//將文件實例化爲一個對象
		File f1 = new File("ceshi.txt");
		File f2 = new File("ceshi2.txt");
		//用字符流綁定
		BufferedReader br = new BufferedReader(new FileReader(f1));
		//用字節流綁定,因爲內存中讀到的是字符流,所以這裏用outputStreamWriter轉成字節
		//注意不要以爲所有帶Reader/Writer後綴的都是與字節流無關,如果沒想明白建議翻看JDK API
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f2)));
		//讀數據
		String src = null ;
		while((src = br.readLine())!=null) {
			bw.write(src);
			bw.newLine();
			bw.flush();
		}
		//關流
		br.close();
		bw.close();

轉換流還有一個作用就是改變輸出數據的編碼,通過fileinputstream 和 fileoutputstream的方法可以控制讀和寫的編碼方式。

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