IO流
1:IO流(掌握)
IO流:把數據看做水流一樣的,從某個地方流向某個地方(1)IO流的作用:上傳文件和下載文件。(本質:讀取數據和寫出數據)
上傳文件:
數據源:本地
目的地:服務器
下載文件:
數據源:服務器
目的地:本地
(2)IO流的分類:
A:流向
輸入流 讀取數據
輸出流 寫出數據
B:數據類型
字節流
字節輸入流
字節輸出流
字符流
字符輸入流
字符輸出流
一般來說,如果沒有說明按照哪種類型分,指的是按照數據類型分。
(3)什麼時候使用字符流,什麼時候使用字節流。
如果一個要操作的文件,通過記事本打開並能夠讀懂其內容,就可以考慮使用字符流。
否則,就使用字節流。 什麼都不知道,就用字節流。
分析問題的步驟:
分析:
A:數據類型?
字符流
B:讀取還是寫出?
輸出流
由A,B可以知道我們要使用的流對象是:Writer
(4)IO的基類及具體類
IO
|--字節流
字節輸入流
InputStream
FileInputStream
字節輸出流
OutputStream
FileOutputStream
|--字符流
字符輸入流
Reader
FileReader
字符輸出流
Writer
FileWriter
(5)FileWriter寫數據的步驟及代碼體現:
步驟:
A:創建字符輸出流對象。
B:調用write方法。
C:釋放資源。
代碼體現:
FileWriter fw= new FileWriter("fw.txt");
fw.write("hello,io");
fw.close();
幾個要注意的小問題:
A:創建字符輸出流對象做了幾件事情?
A:調用系統功能,創建一個文件fw2.txt。
B:創建字符輸出流對象。
C:把對象指向文件。
B:字符輸出流爲什要flush()?
因爲我們使用的是字符流,而數據底層是字節流的數據。
所以,我們不能直接把字符流數據寫到文本文件。
這個時候,數據存在,但是沒有直接進文件,在內存中的緩衝區裏面。
我們需要把緩衝區給刷新一下。
C:爲什麼要close()?
A:關閉流對象,流對象就是垃圾了。
B:通知操作系統去釋放和開始創建的那個文件相關的資源。
D:flush()和close()的區別?
A:flush()刷新緩衝區,流對象還可以繼續使用。
B:close()釋放資源,但是會先刷新一次緩衝區,保證數據不丟失,操作完畢後,流對象不可以再被使用。
E:如何實現數據的換行?
不同的操作系統對換行符的識別不太一致:
windows:\r\n
linux:\n
mac:\r
F:如何實現追加寫入數據?
使用帶兩個參數的構造方法。第二個參數指示是否是追加寫入。
publicFileWriter(String fileName,boolean append)
FileWriterfw = new FileWriter("fw4.txt",true);
//寫數據
for(int x = 0; x < 10; x++) {
fw.write("java"+ x);
//加入換行符
fw.write("\r\n");
}
(6)FileReader讀數據的步驟及代碼體現:
步驟:
A:創建字符輸入流對象。
B:調用read方法,並把數據顯示在控制檯。
C:釋放資源。
代碼體現:
FileReader fr= new FileReader("fr.txt");
//方式1:一次讀取一個字符
int ch =0;
while((ch=fr.read())!=-1){
System.out.print((char)ch);
}
//方式2:一次讀取一個字符數組
char[] chs =new char[1024];
int len =0;
while((len=fr.read(chs))!=-1){
System.out.print(String.valueOf(chs,0,len));
}
fr.close();
(7)複製文本文件:
兩種方式操作。代碼自己補齊。
數據源:c:\\a.txt
目的地:d:\\b.txt
(8)加入異常後的代碼(看懂即可)
A:FileWriter寫數據
B:字符流複製文本文件
2:字節流(掌握)
(1)繼承體系InputStream
FileInputStream
OutputStream
FileOutputStream
(2)案例:
A:字節流複製文本文件。
B:字節流複製圖片。
C:字節流複製MP4並測試效率。
3:高效流(掌握)
(1)字符高效流
BufferedReader
BufferedWriter
案例:
高效流複製文本文件。
(2)字節高效流
BufferedInputStream
BufferedOutputStream
案例:
高效流複製圖片。
(3)字符高效流的特殊功能
BufferedReader
StringreadLine()
BufferedWriter
voidnewLine()
案例:
高效流特殊功能複製文本文件。
(4)IO流的使用
文本文件的複製:9種。
字節流:4種
字符流:5種
二進制流數據的複製:4種。
音視頻文件。
4:轉換流(理解)
(1)鍵盤錄入寫到文本文件。
用Scanner實現。
(2)用System.in錄入數據,寫到文本文件。
BufferedReader br = newBufferedReader(new InputStreamReader(System.in));
理解:從字節到字符
使用:從字節到字符
(3)把文本文件的數據,用System.out寫到控制檯
BufferedWriter bw = newBufferedWriter(new OutputStreamWriter(System.out));
理解:從字符到字節
使用:從字節到字符
(4)案例:
數據源 目的地
a.txt b.txt
a.txt System.out
System.in b.txt
System.in System.out
(5)案例:
System.in -- a.txt -- b.txt --System.out
(6)案例:
A:ArrayList -- a.txt
B:a.txt -- ArrayList
5:字符編碼(理解)
(1)編碼表:由字符及其對應的數值組成的一張表。
(2)常見的編碼表:
ASCII
ISO-8859-1
gb2312
gbk
gb18030
big5
utf-8
(3)編碼問題:
A:IO流中的編碼問題
B:String類中的編碼問題
記住:統一編碼最好。
6:Properties(理解)
(1)是鍵值對形式的屬性列表。是Map體系的一個集合類。
可以和IO流進行結合使用。
(2)案例:
A:作爲Map集合的使用。
B:作爲集合的特有功能使用
a:setProperty(Stringkey,String value)
b:getProperty(Stringkey)
stringPropertyNames()
C:和IO流結合使用的例子
a:load()把文件中的數據加載到集合中
b:store()把集合中的數據存儲到文件中
D:給你一個文件,user.txt。請判斷裏面是否有鍵爲"lisi"的,如果有,則修改其值爲100。
7:打印流(掌握)
(1)打印流僅僅是用來寫數據的,沒有讀取數據的。
(2)打印字節流 PrintStream
System:
public staticfinal PrintStream out
System.out.println();
打印字符流 PrintWriter
(3)特點:
A:可以把任意類型的數據寫到文本文件。
B:如果啓動了自動刷新,在調用println()的方法的時候,可以自動刷新,並換行。
C:可以直接對文件進行操作。
問題:哪些流可以直接對象文件進行操作。
看API,流的構造方法,如果可以同時有File和String類型的參數,就可以。
(4)案例:
通過打印流改進複製文本文件的代碼
BufferedReaderbr = new BufferedReader(new FileReader("a.txt"));
PrintWriter pw = newPrintWriter(new FileWriter("b.txt"),true);
String line =null;
while((line=br.readLine()) !=null) {
pw.println(line);
}
pw.close();
br.close();
8:序列化和反序列化流(理解)
(1)序列化:把對象按照流一樣的方式存儲到文件中或者在網絡中傳輸。
簡記:把對象按照流一樣操作。
反序列化:把文件中或者網絡中的流數據還原成對象。
簡記:流數據還原對象。
(2)對象怎麼才能實現序列化呢?
讓對象所屬的類實現序列化接口。
(3)記住:
看到一個類實現了序列化接口,就要知道,該類的對象可以被序列化流進行操作。
將來還可以通過反序列化流還原。
如果想在序列化後,對java文件做一些簡單的改動,不影響以前寫過的數據,
那麼,就應該在java文件中給出固定的序列化id值。
而且,這樣做了以後,還可以解決黃色警告線問題。
9:其他的幾個瞭解的流對象(理解)
(1)DataOutputStream/DataInputStream
可以把基本數據類型的數據寫到文件,也可以還原爲基本的數據類型的數據。
只不過,要注意還原時候的順序和寫的順序要一致。
(2)ByteArrayOutputStream,ByteArrayInputStream
(3)CharArrayWriter,CharArrayReader