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)生的原因:
亂碼的解決方案:
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ù):程序——>文件囊骤,輸出操作
2.1.2. IO操作示意圖(了解)
講解IO知識(shí)點(diǎn)的時(shí)候晃择,習(xí)慣和生活中的水流聯(lián)系起來,一起來看看復(fù)古的水井和水缸也物。
此時(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. 四大基流
操作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蹋嵌。