Java I/0輸入輸出流、文件基礎(chǔ)

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》字符流——操作的基本都是文本文件

上面沒顯示出來的是:byte存儲(chǔ)結(jié)果

字符流的基本實(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)用;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,728評(píng)論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,428評(píng)論 0 2
  • 日子一天天的近了。祈禱吧! 下個(gè)決心,買把健身凳。
    ywc05閱讀 197評(píng)論 0 0
  • #20161020每天一個(gè)關(guān)鍵詞#獼猴桃 來青島見到大學(xué)同學(xué)兩口子,一起游玩交流甚歡。那天去泡溫泉,他們帶了些獼猴...
    勁汶閱讀 212評(píng)論 0 0

友情鏈接更多精彩內(nèi)容