Java中文件操作入門

1.1. File類(掌握)

File課理解為文件和文件夾(目錄)直撤,用于表示磁盤中某個(gè)文件或文件夾的路徑。該類包含了文件的創(chuàng)建琼蚯、刪除酬凳、重命名、判斷是否存在等方法遭庶。

只能設(shè)置和獲取文件本身的信息(文件大小宁仔,是否可讀),不能設(shè)置和獲取文件里面的內(nèi)容峦睡。

  • Unix: 嚴(yán)格區(qū)分大小寫翎苫,使用”/”來表示路徑分隔符。

  • Windows: 默認(rèn)情況下是不區(qū)分大小寫的榨了,使用”\”來分割目錄路徑煎谍。但是在Java中一個(gè)”\”表示轉(zhuǎn)義,所以在Windows系統(tǒng)中就得使用兩個(gè)”\”龙屉。

操作File常見方法:

  • String getName():獲取文件名稱

  • String getPath():獲取文件路徑

  • String getAbsolutePath():獲取絕對(duì)路徑

  • File getParentFile():獲取上級(jí)目錄文件

  • boolean exists():判斷文件是否存在

  • boolean isFile() :是否是文件

  • boolean isDirectory():判斷是否是目錄

  • boolean delete() :刪除文件

  • boolean mkdirs():創(chuàng)建當(dāng)前目錄和上級(jí)目錄

  • File[] listFiles() :列出所有文件對(duì)象

public class FileDemo {

    public static void main(String[] args) throws Exception {

        File f = new File("C:/test/123.txt");

        System.out.println(f.getName());//123.txt

        System.out.println(f.getPath());//C:/test/123.txt

        System.out.println(f.getAbsolutePath());//C:/test/123.txt

        System.out.println(f.getParentFile().getName());//test

        System.out.println(f.exists());//true

        System.out.println(f.isFile());//true

        System.out.println(f.isDirectory());//false

        //如果當(dāng)前文件的父文件夾不存在,則創(chuàng)建

        if(!f.getParentFile().exists()) {

            f.getParentFile().mkdirs();

        }

        //列出當(dāng)前文件夾中所有文件

        File[] fs = f.getParentFile().listFiles();

        for (File file : fs) {

            System.out.println(file);

        }

    }

}

列出給定目錄中的全部文件的路徑呐粘,包括給定目錄下面的所有子目錄。

public static void list(File file) {

    if (file.isDirectory()) {

        // 如果是文件夾转捕,則繼續(xù)列出

        File[] fs = file.listFiles();

        if (fs != null) {

            for (File f : fs) {

                list(f);

            }

        }

    }

    System.out.println(file);

}

1.2. 字符編碼

1.2.1. 字符編碼的發(fā)展歷程(了解)

階段一

計(jì)算機(jī)只認(rèn)識(shí)數(shù)字作岖,在計(jì)算機(jī)里一切數(shù)據(jù)都是以數(shù)字來表示,因?yàn)橛⑽姆?hào)有限瓜富,所以規(guī)定使用的字節(jié)的最高位是0鳍咱。每一個(gè)字節(jié)都是以0~127之間的數(shù)字來表示,比如A對(duì)應(yīng)65与柑,a對(duì)應(yīng)97谤辜。此時(shí)把每一個(gè)字節(jié)按照順序存放在一張表格中,這就是美國標(biāo)準(zhǔn)信息交換碼——ASCII編碼表价捧。

階段二

隨著計(jì)算機(jī)在全球的普及丑念,很多國家和地區(qū)都把自己的字符引入了計(jì)算機(jī),比如漢字结蟋。此時(shí)發(fā)現(xiàn)一個(gè)字節(jié)(128個(gè))能表示數(shù)字范圍太小脯倚,而漢字太多,128個(gè)數(shù)字不能包含所有的中文漢字,那么此時(shí)就規(guī)定使用兩個(gè)字節(jié)一起來表示一個(gè)漢字推正。

規(guī)定:原有的ASCII字符的編碼保持不變恍涂,仍然使用一個(gè)字節(jié)表示,為了區(qū)別一個(gè)中文字符與兩個(gè)ASCII碼字符植榕,中文字符的每個(gè)字節(jié)最高位(符號(hào)位)規(guī)定為1(中文的二進(jìn)制是負(fù)數(shù))再沧,該規(guī)范就是GB2312編碼表。后來在GB2312碼表的基礎(chǔ)上增加了更多的中文漢字尊残,也就出現(xiàn)了更強(qiáng)大的GBK碼表炒瘸。

階段三

中國人是認(rèn)識(shí)漢字的,現(xiàn)在需要和外國人通過網(wǎng)絡(luò)交流寝衫,此時(shí)需要把把漢字信息傳遞給外國人顷扩,但外國的碼表中沒有收錄漢字,此時(shí)就會(huì)把漢字顯示為另一個(gè)符號(hào)甚至不能識(shí)別的亂碼慰毅。為了解決各個(gè)國家因?yàn)楸镜鼗址幋a帶來的影響隘截,就干脆把全世界所有的符號(hào)統(tǒng)一收錄進(jìn)Unicode編碼表。

如果使用Unicode碼表事富,那么某一個(gè)字符在全世界任何地方都是固定的技俐。比如'哥'這個(gè)字乘陪,在任何地方都是以十六進(jìn)制的54E5來表示统台,因此說Unicode是國際統(tǒng)一編碼。

1.2.2. 常見的字符編碼和操作(了解)

常見的字符集

  • ASCII:占一個(gè)字節(jié)啡邑,只能包含128個(gè)符號(hào)贱勃。不能表示漢字。

  • ISO-8859-1:也稱之為latin-1谤逼,占一個(gè)字節(jié)贵扰,收錄西歐語言,不能表示漢字流部。

  • GB2312/GBK/GB18030:占兩個(gè)字節(jié)戚绕,支持中文。

  • ANSI:占兩個(gè)字節(jié)枝冀,在簡(jiǎn)體中文的操作系統(tǒng)中ANSI 就指的是 GBK舞丛。

  • UTF-8:是一種針對(duì)Unicode的可變長(zhǎng)度字符編碼,是Unicode的實(shí)現(xiàn)方式之一果漾,支持中文球切。在開發(fā)中建議使用。

  • UTF-8 BOM:是微軟搞出來的一種編碼绒障,不要使用吨凑。

存儲(chǔ)字母、數(shù)字户辱、漢字:

存儲(chǔ)字母和數(shù)字無論是什么字符集都占1個(gè)字節(jié).

存儲(chǔ)漢字鸵钝,GBK家族占兩個(gè)字節(jié)糙臼,UTF-8家族占3個(gè)字節(jié)。

不能使用單字節(jié)的字符集(ASCII恩商、ISO-8859-1)來存儲(chǔ)中文弓摘,否則會(huì)亂碼。

1.2.3. 字符的編碼和解碼操作(掌握)

數(shù)據(jù)在網(wǎng)絡(luò)上傳輸是以二進(jìn)制的格式痕届,二進(jìn)制格式就是byte數(shù)組韧献,此時(shí)需要把信息做編碼和解碼處理。

  • 編碼:把字符串轉(zhuǎn)換為byte數(shù)組 String--->byte[]

  • 解碼:把byte數(shù)組轉(zhuǎn)換為字符串 byte[]--->String

注意:一定要保證編碼和解碼的字符相同研叫,才能正確解碼出信息锤窑。

經(jīng)典案例:在表單中填寫中文,為什么在服務(wù)端看到的是亂碼問題嚷炉。

情景分析渊啰,比如瀏覽器使用UTF-8編碼,服務(wù)器使用ISO-8859-1編碼申屹。

此時(shí)編碼和解碼的字符類型不同绘证,那么亂碼就出現(xiàn)了。

先來分析亂碼產(chǎn)生的原因:

image.png

亂碼的解決方案:

image.png
public class CodeDemo {

    public static void main(String[] args) throws Exception {

        String input = "龍哥";//模擬用戶輸入的中文數(shù)據(jù)

        //編碼操作:String -> byte[]

        byte[] data = input.getBytes("UTF-8");

        System.out.println(Arrays.toString(data));//[-23, -66, -103, -27, -109, -91]

        //解碼操作:byte[] -> String

        //因?yàn)榉?wù)器時(shí)老外寫的,老外在解碼的時(shí)候使用ISO-8859-1,此時(shí)就亂碼了

        String ret = new String(data, "ISO-8859-1");

        System.out.println(ret);//輸出:é???“¥

        //---------------------------------------------

        //解決方案:重新對(duì)亂碼編碼回到byte[],重新按照UTF-8解碼

        data = ret.getBytes("ISO-8859-1");

        System.out.println(Arrays.toString(data));//[-23, -66, -103, -27, -109, -91]

        ret = new String(data,"UTF-8");

        //---------------------------------------------

        System.out.println(ret);//輸出:龍哥

    }

}

2. IO流操作

2.1. IO流概述(了解)

2.1.1. IO概述(了解)

什么是IO哗讥,Input和Output嚷那,即輸入和輸出。

電腦相關(guān)的IO設(shè)備:和電腦通信的設(shè)備杆煞,此時(shí)要站在電腦的角度魏宽,把信息傳遞給電腦叫輸入設(shè)備,把電腦信息傳遞出來的叫輸出設(shè)備决乎。

  • 輸入設(shè)備:麥克風(fēng)队询、掃描器、鍵盤构诚、鼠標(biāo)等

  • 輸出設(shè)備:顯示器蚌斩、打印機(jī)、投影儀范嘱、耳機(jī)送膳、音響等

為什么程序需要IO呢?

案例1:打游戲操作彤侍,需要存儲(chǔ)游戲的信息肠缨。

  • 此時(shí)需要把游戲中的數(shù)據(jù)存儲(chǔ)起來,數(shù)據(jù)只能存儲(chǔ)在文件中盏阶。

案例2:打游戲操作晒奕,需求讀取之前游戲的記錄信息,數(shù)據(jù)存儲(chǔ)在一個(gè)文件中的。

  • 此時(shí)游戲程序需要去讀取文件中的數(shù)據(jù)脑慧,并顯示在游戲中魄眉。

IO操作是一個(gè)相對(duì)的過程,一般的闷袒,我們?cè)诔绦蚪嵌葋硭伎迹ǔ绦虻膬?nèi)存)坑律。

  • 程序需要讀取數(shù)據(jù):文件——>程序,輸入操作

  • 程序需要保存數(shù)據(jù):程序——>文件囊骤,輸出操作

image.png

2.1.2. IO操作示意圖(了解)

講解IO知識(shí)點(diǎn)的時(shí)候晃择,習(xí)慣和生活中的水流聯(lián)系起來,一起來看看復(fù)古的水井和水缸也物。

image.png

此時(shí)站在水缸的角度宫屠,分析IO的操作方向:

輸入操作:水井——>水缸

輸出操作:水缸——>飯鍋

注意:誰擁有數(shù)據(jù),誰就是源滑蚯,把數(shù)據(jù)流到哪里浪蹂,哪里就是目標(biāo)。那么告材,請(qǐng)問水缸是源還是目標(biāo)坤次。

2.1.3. 流的分類(掌握)

根據(jù)流的不同特性,流的劃分是不一樣的斥赋,一般按照如下情況來考慮:

  • 按流動(dòng)方向:分為輸入流和輸出流

  • 按數(shù)據(jù)傳輸單位:分為字節(jié)流和字符流缰猴,即每次傳遞一個(gè)字節(jié)(byte)或一個(gè)字符(char)

  • 按功能上劃分:分為節(jié)點(diǎn)流和處理流,節(jié)點(diǎn)流功能單一灿渴,處理流功能更強(qiáng)

流的流向是相對(duì)的洛波,我們一般站在程序的角度:

  • 程序需要數(shù)據(jù) → 把數(shù)據(jù)讀進(jìn)來 → 輸入操作(read):讀進(jìn)來

  • 程序保存數(shù)據(jù) → 把數(shù)據(jù)寫出去 → 輸出操作(write):寫出去

六字箴言:讀進(jìn)來胰舆,寫出去(仔細(xì)揣摩這六個(gè)字有什么高深的含義)

2.1.4. 四大基流

image.png

操作IO流的模板:

1):創(chuàng)建源或者目標(biāo)對(duì)象(挖井).

 輸入操作:    把文件中的數(shù)據(jù)流向到程序中,此時(shí)文件是源,程序是目標(biāo).

 輸出操作:    把程序中的數(shù)據(jù)流向到文件中,此時(shí)文件是目標(biāo),程序是源.

2):創(chuàng)建IO流對(duì)象(水管).

 輸入操作:     創(chuàng)建輸入流對(duì)象.

 輸出操作:     創(chuàng)建輸出流對(duì)象.

3):具體的IO操作.

 輸入操作:    輸入流對(duì)象的read方法.

 輸出操作:    輸出流對(duì)象的write方法.

4):關(guān)閉資源(勿忘). 一旦資源關(guān)閉之后,就不能使用流對(duì)象了,否則報(bào)錯(cuò).

 輸入操作:    輸入流對(duì)象.close();

 輸出操作:    輸出流對(duì)象.close();

注意:

  • 四大抽象流是不能創(chuàng)建對(duì)象的骚露,一般的我們根據(jù)不同的需求創(chuàng)建他們不同的子類對(duì)象,比如操作文件時(shí)就使用文件流缚窿。

  • 不管是什么流棘幸,操作完畢都必須調(diào)用close方法,釋放資源倦零。

若要獲得最好的學(xué)習(xí)效果误续,需要配合對(duì)應(yīng)教學(xué)視頻一起學(xué)習(xí)。需要完整教學(xué)視頻扫茅,請(qǐng)參看https://ke.qq.com/course/272077蹋嵌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市葫隙,隨后出現(xiàn)的幾起案子栽烂,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腺办,死亡現(xiàn)場(chǎng)離奇詭異焰手,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)怀喉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門书妻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人躬拢,你說我怎么就攤上這事躲履。” “怎么了聊闯?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵崇呵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我馅袁,道長(zhǎng)域慷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任汗销,我火速辦了婚禮犹褒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弛针。我一直安慰自己叠骑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布削茁。 她就那樣靜靜地躺著宙枷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茧跋。 梳的紋絲不亂的頭發(fā)上慰丛,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音瘾杭,去河邊找鬼诅病。 笑死,一個(gè)胖子當(dāng)著我的面吹牛粥烁,可吹牛的內(nèi)容都是我干的贤笆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼讨阻,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼芥永!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钝吮,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤埋涧,失蹤者是張志新(化名)和其女友劉穎贴唇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體飞袋,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戳气,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巧鸭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓶您。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖纲仍,靈堂內(nèi)的尸體忽然破棺而出呀袱,到底是詐尸還是另有隱情,我是刑警寧澤郑叠,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布夜赵,位于F島的核電站,受9級(jí)特大地震影響乡革,放射性物質(zhì)發(fā)生泄漏寇僧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一沸版、第九天 我趴在偏房一處隱蔽的房頂上張望嘁傀。 院中可真熱鬧,春花似錦视粮、人聲如沸细办。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笑撞。三九已至,卻和暖如春钓觉,著一層夾襖步出監(jiān)牢的瞬間茴肥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工议谷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炉爆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓卧晓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親赴捞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逼裆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容