IO之FileInputStream和FileOutputStream

1.定義
I:input 輸入(讀取)
O:output 輸出(寫入)
流:數據(字符,字節)1個字符=2個字節=8個二進制位

字節:	輸入流inputStream		輸出流OutputStream
字符:	輸入流Reader				輸出流Writer

2.創建FileOutputStream
1)一次寫一個字節

public static void main(String[] args) throws IOException {
	//創建一個文件輸出流,將字節輸出到fos.dat文件中
	FileOutputStream fos = new FileOutputStream("fos.dat");
	fos.write(13);
	fos.close();
}
2)一次寫多個字節
public static void main(String[] args) throws IOException {
		//創建一個文件輸出流,將字節輸出到fos.dat文件中
		FileOutputStream fos = new FileOutputStream("fos.dat");
		byte[] bytes = {65, 66, 67, 68};
		//寫入字符數組
		fos.write(bytes);
		//寫入從第一位開始,長度爲2的兩個字符
		fos.write(bytes, 1, 2);
		//寫入字符串
		byte[] bytes2 = "您好".getBytes();
		fos.write(bytes2);
		fos.close();
	}
3)追加寫,換行寫
	FileOutputStream (String name, boolean append)
	String name:寫入數據的目的地
	 boolean append:追加寫開關
	 							true:常見對象不會覆蓋原文件,繼續在文件末尾追加寫數據;
	 							false:創建一個新文件,覆蓋原文件
	 	換行符:Windows:\r\n
	 				  linux:/n
	 				  mac:/r		
public static void main(String[] args) throws IOException {
		//創建一個文件輸出流,將字節輸出到fos.dat文件中
		FileOutputStream fos = new FileOutputStream("fos.dat", true);
		for(int i = 1; i <= 10; i++) {
			fos.write("你好".getBytes());
			fos.write("\r\n".getBytes());
		}
		fos.close();
	}

3.創建FileInputStream
1)一次讀取一個字節

public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream("fos.dat");
		/*int len = fis.read();
		System.out.println(len)
		len = fis.read();
		System.out.println(len);
		len = fis.read();
		System.out.println(len);*/
		
		int len = 0;
		while((len = fis.read()) != -1) {
			System.out.println(len);
		}
		fis.close();
	}

2)一次讀取多個字節

public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream("fos.dat");
		byte[] bytes = new byte[2*1024];
		//int len = fis.read(bytes);
		int len = 0;
		while(len = fis.read(bytes)!= -1){
			System.out.println(new String(bytes, 0, len);//讀取有效的數據
		}
		System.out.println(new String(bytes));
		fis.close();
	}

4.文件的複製(練習)

public static void main(String[] args) throws IOException {
		FileInputStream fis = new FileInputStream("fos.dat");
		FileOutputStream fos = new FileOutputStream("fos-copy.dat");
		
		byte[] bytes = new byte[2*1024];
		int len = 0;
		while((len = fis.read(bytes)) != -1){
			fos.write(bytes, 0, len);
		}
		
		System.out.println(new String(bytes));
		fos.close();
		fis.close();
	}

5.文件字符輸入流FileReader

public static void main(String[] args) throws IOException {
		FileReader fr = new FileReader("dos.data");
		
		/*int len =0;
		while((len = fr.read()) != -1) {
			System.out.println((char)len);
		}*/
		
		char[] cs = new char[2*1024];
		int len = 0;
		while((len = fr.read(cs)) !=-1) {
			System.out.println(new String(cs, 0, len));
		}
		fr.close();
	}

6.文件字符輸出流FileWriter
flush方法和close方法的區別:
flush:刷新緩衝區,流對象可以繼續使用
close:先刷新緩衝區,然後通知系統釋放資源。流對象不可以再被使用了。

public static void main(String[] args) throws IOException {
		FileWriter fw = new FileWriter("dos.data");
		//fw.write(97);//寫一個字符
		
		char[] cs = {'a', 'b', 'c', 'd'};
		fw.write(cs);//abcd
		fw.write(cs, 1, 3);//bcd
		fw.write("我愛你");//我愛你
		fw.write("我愛你", 2, 2);//愛你
		fw.flush();
		fw.close();
	}

3)追加寫,換行寫
FileWriter (String name, boolean append)
String name:寫入數據的目的地
boolean append:追加寫開關
true:常見對象不會覆蓋原文件,繼續在文件末尾追加寫數據;
false:創建一個新文件,覆蓋原文件
換行符:Windows:\r\n
linux:/n
mac:/r

public static void main(String[] args) throws IOException {
		FileWriter fw = new FileWriter("dos.data", true);
		for(int i = 0; i <= 10; i++) {
			fw.write("hello" + i + "\r\n");
		}
		fw.close();
	}

7.有了字節輸入流爲什麼還要字符輸入流?

字符流處理的單元爲2個字節的Unicode字符,分別操作字符、字符數組或字符串,而字節流處理單元爲1個字節, 操作字節和字節數組。所以字符流是由Java虛擬機將字節轉化爲2個字節的Unicode字符爲單位的字符而成的,所以它對多國語言支持性比較好!如果是 音頻文件、圖片、歌曲,就用字節流好點,如果是關係到中文(文本)的,用字符流好點.

所有文件的儲存是都是字節(byte)的儲存,在磁盤上保留的並不是文件的字符而是先把字符編碼成字節,再儲存這些字節到磁盤。在讀取文件(特別是文本文件)時,也是一個字節一個字節地讀取以形成字節序列.

字節流可用於任何類型的對象,包括二進制對象,而字符流只能處理字符或者字符串; 2. 字節流提供了處理任何類型的IO操作的功能,但它不能直接處理Unicode字符,而字符流就可以。

簡單的說,假如一個一個字節的往文件裏輸入,一個文件讀寫次數太大了,很毀硬盤,但如果一個一個字符的保存,硬盤讀寫次數就會少很多,甚至可以一行一行的保存。

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