1、Java編碼基礎(chǔ)
對(duì)于Java文件中,是采用的雙字節(jié)編碼utf-16be;
其中,中文占用2個(gè)字節(jié),英文占用2個(gè)字節(jié);
對(duì)于文本文件,實(shí)際上就是字節(jié)序列;可以是任意編碼的字節(jié)序列;
如果我們?cè)谥形臋C(jī)器上直接創(chuàng)建文本文件,那么該文本文件只認(rèn)識(shí)ANSI編碼;對(duì)于在該機(jī)器上創(chuàng)建的文件,該系統(tǒng)只會(huì)認(rèn)識(shí)ANSI編碼文件,其他類型編碼的會(huì)識(shí)別成亂碼;而對(duì)于在其他器件上創(chuàng)建的編碼格式復(fù)制到該機(jī)器上時(shí),該機(jī)器是能夠識(shí)別的;但是如果是直接將文本文件里面的內(nèi)容復(fù)制粘貼到該機(jī)器中新建的文件中時(shí),機(jī)器會(huì)自動(dòng)進(jìn)行轉(zhuǎn)換,而不會(huì)出現(xiàn)亂碼。
utf-8中一個(gè)中文占3個(gè)字節(jié)
gbk中一個(gè)中文占2個(gè)字節(jié)
2、file類中常用的API
java.io.File類用于表示文件(或者 目錄);
File類只用于表示文件(目錄)的信息(名稱、大小等),不能用于文件內(nèi)容的訪問;
file類的構(gòu)造函數(shù)類型;File file=new File("E:\\javaio");或者File file1=new File("e:"+File.separator); ?其中,由于Java中“\”表示轉(zhuǎn)義字符,所以要用雙斜杠\\來表示文件夾目錄,或者用一個(gè)“/”也行;另外一種構(gòu)造方法的File.separator為設(shè)置分隔符,無論任何系統(tǒng),都能夠識(shí)別該分隔符表示;
判斷是否是一個(gè)目錄或者文件:file.isDirectory();或者file.isFile();
file文件是否存在:file.exists();
如果不存在,則創(chuàng)建該file文件:file.mkdir(); 創(chuàng)建多級(jí)目錄:file.mkdirs();
刪除file文件:file.delete();
當(dāng)直接打印“file”,則打印的是file.toString()的內(nèi)容,即目錄,而不是file文件內(nèi)部的內(nèi)容;此時(shí)該方法也可以使用“獲取絕對(duì)路徑”的方法:file.getAbsolutePath();
獲取文件的名字:file.getName();獲取目錄文件最后的目錄名;如果是一個(gè)文件的名字時(shí),該方法得到的是具體文件的名字;
父目錄:file.getParent(); 或者 file.getParentFile();
3、常用函數(shù)

list()方法用于列出當(dāng)前目錄下的子目錄和文件,返回的是字符串?dāng)?shù)組(直接子目錄的名稱,不包含子目錄里面的內(nèi)容)
如果要遍歷子目錄下的內(nèi)容就需要構(gòu)造File對(duì)象做遞歸操作,F(xiàn)ile提供了直接返回File對(duì)象的API;File[] files=dir.listFiles();//返回的是直接子目錄(文件)的抽象;

4、RandomAccessFile 隨機(jī)獲取文件(對(duì)文件的內(nèi)容進(jìn)行操作)
是Java提供的對(duì)文件內(nèi)容的訪問,既可以讀文件,也可以寫文件;并且該類型還支持隨機(jī)訪問文件,可以訪問文件的任意位置;
1)Java文件模型:在硬盤上的文件是byte byte byte存儲(chǔ)的,是數(shù)據(jù)的集合;
2)打開文件:有兩種模式“rw” “r”(只讀);
RandomAccessFile raf = new RandomAccessFile(file, "rw");指定要打開的文件,以及讀取的方式;
因?yàn)槭请S機(jī)訪問文件,所以內(nèi)部還包含有一個(gè)文件指針;打開文件時(shí),指針在開始的位置,pointer = 0;
3)寫方法:raf.write(int); 內(nèi)部可以寫一個(gè)整數(shù)或者其他的;write只能寫一個(gè)字節(jié)(后八位),同時(shí)指針指向下一個(gè)位置,準(zhǔn)備再次寫入;
4)讀方法:int b = raf.read(); 從指針?biāo)诘奈恢瞄_始讀一個(gè)字節(jié),將該字節(jié)轉(zhuǎn)化成整數(shù);
5)文件讀寫完成以后一定要關(guān)閉:
5、IO流(輸入流、輸出流)
分別有字節(jié)流、字符流

《1》字節(jié)流
inputstream和outputstream的相關(guān)子類
如:
1)FileInputStream:具體實(shí)現(xiàn)了在文件上讀取數(shù)據(jù);
2)FileOutputStream:具體實(shí)現(xiàn)了向文件中寫出byte數(shù)據(jù)的方法;
3)DataInputStream / DataOutputStream:是對(duì)“流”功能的擴(kuò)展,可以更加方便地讀取int、long、字符等類型數(shù)據(jù);
4)DataOutputStream中的方法有:writeInt() / writeDouble() / writeUTF();這些方法實(shí)際上是將OutputStream中的方法進(jìn)行了封裝,從而可以直接寫出int等類型;
5)BufferedInputStream / BufferedOutputStream:這兩個(gè)流類為IO提供了帶緩沖區(qū)的操作,一般打開文件進(jìn)行寫入或讀取操作時(shí),都會(huì)加上緩沖,這種流模式提高了IO的性能;
對(duì)于上述各種IO流的比較:當(dāng)從應(yīng)用程序中把輸入放入文件中時(shí),相當(dāng)于將一缸水倒入到另一個(gè)缸中:
FileOutputStream中write()方法相當(dāng)于一滴一滴地把水“轉(zhuǎn)移”過去;
DataOutputStream中的writeXxx()方法會(huì)方便一些,相當(dāng)于一瓢一瓢地把水“轉(zhuǎn)移”過去;
BufferedOutputStream中的write方法更方便,相當(dāng)于一瓢一瓢地先放入桶中,再從桶中倒入到另一個(gè)缸中;
《2》字符流——操作的基本都是文本文件

字符流的基本實(shí)現(xiàn):
InputStreamReader:完成byte流解析為char流,按照編碼規(guī)則解析;
OutputStreamWriter:提供char流到byte流的編碼,按照編碼規(guī)則處理;
FileReader/ FileWriter:可以直接對(duì)文件進(jìn)行操作;這兩個(gè)類無法識(shí)別其他類型的編碼格式,在自己的項(xiàng)目中,只能識(shí)別自己的編碼格式,所以在編碼的時(shí)候一定要統(tǒng)一成項(xiàng)目的編碼格式;
BufferedReader/ BufferedWriter 字符流的過濾器 ?每次可以讀、寫一行readLine();
PrintWriter:向文本輸出流打印對(duì)象的格式化表示形式,方便打印輸出。
《3》對(duì)象的序列化和反序列化問題

4)transient 關(guān)鍵字修飾的變量不會(huì)進(jìn)行JVM默認(rèn)的序列化操作,但是可以自己完成這個(gè)元素的序列化;
在某些情況下能夠提高性能(不用序列化的就不序列化,需要序列化的自行序列化,從而提高性能);
4)序列化時(shí),當(dāng)父類實(shí)現(xiàn)了序列化接口,則子類也必然是實(shí)現(xiàn)了序列化,所以子類不用再實(shí)現(xiàn)序列化接口,只用繼承父類即可;(子類會(huì)遞歸調(diào)用父類的構(gòu)造函數(shù),無論父類是否實(shí)現(xiàn)了序列化接口)
5)反序列化時(shí),當(dāng)對(duì)子類對(duì)象進(jìn)行反序列化操作時(shí),如果其父類沒有實(shí)現(xiàn)序列化接口,那么其父類的構(gòu)造函數(shù)將被調(diào)用;如果父類實(shí)現(xiàn)了序列化接口,則該父類的構(gòu)造函數(shù)將看不到被調(diào)用,即子類不會(huì)遞歸調(diào)用父類的構(gòu)造函數(shù)(調(diào)用的前提是該父類沒有實(shí)現(xiàn)序列化接口);
因?yàn)楫?dāng)子類實(shí)現(xiàn)了序列化接口時(shí),相當(dāng)于對(duì)于這個(gè)子類中的對(duì)象已經(jīng)可以從存儲(chǔ)的那個(gè)文件中直接讀取了,則在反序列化時(shí),就不會(huì)調(diào)用父類的構(gòu)造函數(shù);而當(dāng)子類不能進(jìn)行序列化時(shí),那么其父類的構(gòu)造函數(shù)會(huì)被調(diào)用,那么在反序列化時(shí),其父類對(duì)象相應(yīng)地就將會(huì)被調(diào)用;