?? day13.txt
字號:
I/O流
流的概念:程序與數(shù)據(jù)來源之間的橋梁
流的分類:
按數(shù)據(jù)方向分:輸入流和輸出流
輸入流:InputStream/Reader
OutputStream/Writer
按數(shù)據(jù)類型分:字節(jié)流和字符流
字節(jié)流:InputStream/OutputStream
字符流:Reader/Writer
按流的功能分:節(jié)點流和處理流
節(jié)點流用操作數(shù)據(jù)的來源。
處理流用來封裝節(jié)點流,從而給節(jié)點流增加一個功能,不能獨立存在,在關(guān)閉流時如果使用了處理流,只需關(guān)閉最外層的流就可以了。
區(qū)分節(jié)點流和處理流的小方法:
看構(gòu)造器,節(jié)點流參數(shù)為數(shù)據(jù)來源,而處理流參數(shù)為其他流。
選擇流的思路:
先考慮是輸入流還是輸出流,
再考慮是字節(jié)流還是字符流,
最后考慮是節(jié)點流還是處理流。
字符流:Reader和Writer所有字符流的父類型
Java技術(shù)使用Unicode來表示字符串和字符,而且提供16位版本的流,以便用類似的方法處理字符。
如果構(gòu)造了一個連接到流的Reader和Writer,轉(zhuǎn)換規(guī)則會在使用缺省平臺所定義的字節(jié)編碼和Unicode之間切換。
橋梁流:InputStreamReader和OutputStreamWriter(字節(jié)流轉(zhuǎn)化成字符流的橋轉(zhuǎn)換器)
這兩個類不是用于直接輸入輸出的,他是將字節(jié)流轉(zhuǎn)換成字符流的橋轉(zhuǎn)換器,并可以指定編解碼方式。
逐行讀寫流:BufferedReader/BufferedWriter
以上兩個都是過濾流,需要用其他的節(jié)點流來作參數(shù)構(gòu)造對象。
BufferedReader的方法:readLine():String ,當(dāng)他的返回值是null時,就表示讀取完畢了。要注意,再寫入時要注意寫換行符,否則會出現(xiàn)阻塞。
BufferedWriter的方法:newLine() ,這個方法會寫出一個換行符。
管道流:線程交互的時候使用
PipedInputStream/PipedOutputStream
傳送輸出流可以連接到傳送輸入流,以創(chuàng)建通信管道。傳送輸出流是管道的發(fā)送端。通常,數(shù)據(jù)由某個線程寫入 PipedOutputStream 對象,并由其他線程從連接的 PipedInputStream 讀取。
注意:管道輸出流和管道輸入流需要對接。
數(shù)據(jù)流:DataInputStream和DataOutputStream
通過流來讀寫Java基本類,注意DataInputStream和DataOutputStream的方法是成對的。
支持直接輸出輸入各種數(shù)據(jù)類型。
注意:使用DataOutputStream/DataInputStream時,要注意寫入順序和讀取順序相同,否則會將沒有分割寫入的信息分割不正確而讀取出錯誤的數(shù)據(jù)。
Properties類:針對屬性文件(*.properties,內(nèi)容是name=value)進(jìn)行操作,在java.util包下
load(InputStream inStream)
從輸入流中讀取屬性列表(鍵和元素對)。
getProperty(String key)
用指定的鍵在此屬性列表中搜索屬性。
java編碼方式:
編碼:把字符轉(zhuǎn)換成數(shù)字存儲到計算機(jī)中,按ASCII將字母映射為整數(shù)。
解碼:把數(shù)字從計算機(jī)轉(zhuǎn)換成相應(yīng)的字符的過程。
不同的國家有不同的編碼,當(dāng)編碼方式和解碼方式不統(tǒng)一時,產(chǎn)生亂碼。
因為美國最早發(fā)展軟件,所以每種的編碼都向上兼容ASCII 所以英文沒有亂碼。
ASCII(英文) 1個字符占一個字節(jié)(所有的編碼集都兼容ASCII)
ISO8859-1(拉丁文) 1個字符占一個字節(jié)
GB-2312/GBK 1個字符占兩個字節(jié)(多用于中文)
Unicode 1個字符占兩個字節(jié)(網(wǎng)絡(luò)傳輸速度慢)
UTF-8 變長字節(jié),對于英文一個字節(jié),對于漢字兩個或三個字節(jié)。
中文編碼時出現(xiàn)亂碼的情況:
用流操作文件。
網(wǎng)頁(動態(tài)靜態(tài))。
網(wǎng)絡(luò)傳遞消息。
解決亂碼的方式:
String temp = 亂碼的字符串
temp = new String(temp.getBytes("ISO8859-1") , "GBK")
將temp按照ISO8859-1的方式進(jìn)行解碼生成一個字節(jié)序列,然后在按照GBK的方式解碼字節(jié)序列生成字符串。
File類:可表示文件或者目錄
File下的方法是對磁盤上的文件進(jìn)行磁盤操作,但是無法讀寫文件的內(nèi)容。
構(gòu)造器:
File(String pathname) //以文件的路徑做參數(shù)
File類的方法:
boolean createNewFile()
創(chuàng)建一個新文件
File createTempFile(String prefix, String suffix, File directory)
在指定目錄中創(chuàng)建一個新的空文件,使用給定的前綴和后綴字符串生成其名稱。會在前綴和后綴之間加一個隨機(jī)數(shù)
boolean mkdir()
創(chuàng)建一個新目錄
boolean delete()
刪除文件,刪除的是創(chuàng)建File對象時指定與之關(guān)聯(lián)創(chuàng)建的那個文件。
String[] List()
返回當(dāng)前File對象下所有顯文件和目錄名(相對路徑)
File[] ListFiles()
返回當(dāng)前File對象(必須是目錄)下的所有File對象,可以用getName()來訪問到文件名。
boolean isDirectory()和boolean isFile()
判斷究竟是目錄還是文件。
boolean exists()
判斷文件或文件夾是否存在。
String getPath()
獲得相對路徑。
String getAbsolutePath()
獲得文件的絕對路徑
注意:
File類的對象實施表示一個文件并不是真正的文件,只是一個代理而已,通過這個代理來操作文件
創(chuàng)建一個文件對象和創(chuàng)建一個文件在java中是兩個不同的概念。前者是在虛擬機(jī)中創(chuàng)建了一個文件,但卻并沒有將它真正地創(chuàng)建到OS的文件系統(tǒng)中,隨著虛擬機(jī)的關(guān)閉,這個創(chuàng)建的對象也就消失了。而創(chuàng)建一個文件才是在系統(tǒng)中真正地建立一個文件。
例如:
File f=new File(“11.txt”); //創(chuàng)建一個名為11.txt的文件對象
f.CreateNewFile(); //真正地創(chuàng)建文件
RandomAccessFile:
允許隨機(jī)訪問文件,類支持直接輸出輸入各種數(shù)據(jù)類型。
構(gòu)造器:
RandomAccessFile(File file, String mode)
創(chuàng)建從中讀取和向其中寫入(可選)的隨機(jī)存取文件流,該文件由 File 參數(shù)指定。
RandomAccessFile(String name, String mode)
創(chuàng)建從中讀取和向其中寫入(可選)的隨機(jī)存取文件流,該文件具有指定名稱。
mode( r:以只讀方式打開 rw:可讀可寫,不存在則創(chuàng)建)
相關(guān)方法:
long getFilePointer()
返回文件指針的當(dāng)前位置。
void seek(long pos)
設(shè)置文件指針到給定的絕對位置。
long length()
返回文件的長度。
對象流:ObjectInputStream和ObjectOutputStream(實現(xiàn)對象序列化)
對象流是過濾流,需要節(jié)點流作參數(shù)來構(gòu)造對象,用于直接把對象寫入文件和從文件中讀取對象。
只有實現(xiàn)了Serializable接口的類型的對象才可以被讀寫,Serializable接口是個標(biāo)記接口,其中沒有定義方法。
對象會序列化成一個二進(jìn)制代碼,文件中保存對象的屬性。
writeObject(o)、readObject()這兩個是對象讀寫操作時用的方法。
Object o = new Object();
FileOutputStream fos=new FileOutputStream("Object.txt");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(o);
oos.close();
FileInputStream fis =new FileInputStream(“Object.txt”);
ObjectInputStream ois =new ObjectInputStream(fis);
Object o = (Object)Ois.readObject();
ois.close();
一個類中有其他類型的對象,那么,這個類實現(xiàn)了Serializable接口,在對象序列化時,也同樣要求這個類中屬性都能夠?qū)ο笮蛄谢ɑ绢愋统猓?
注意:
對于對象流的操作,在寫對象時要一次寫入完畢,如果使用追加模式寫入,只會讀取到上一次寫入的對象,使用對象流寫入時,會先寫入一個頭部,然后寫入數(shù)據(jù),最后加上結(jié)束符號,如果使用追加方式寫入的話,那就會在結(jié)束符號繼續(xù)向下寫入,但是在讀取時只會讀到結(jié)束符為止,以后再次寫入的數(shù)據(jù)就會丟失。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -