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