File類
File類用來描述一個文件或者文件夾。
構造方法:
File(String pathname) 通過給定路徑名字來創(chuàng)建一個File對象。
File(URI uri) 通過給定URI來創(chuàng)建一個File對象焕数。
File(File parent, String child) 根據(jù)File父路徑和String子路徑創(chuàng)建一個File對象步清。
File(String parent, String child) 根據(jù)String父路徑和String子路徑創(chuàng)建一個File對象。
File.separator目錄分割符
與系統(tǒng)有關的默認名稱分隔符钦铁,為了方便,它被表示為一個字符串才漆。此字符串只包含一個字符.
常用方法:
boolean createNewFile() 在指定位置創(chuàng)建一個新文件牛曹,成功返回true,已存在就不創(chuàng)建返回false
boolean mkdir() 在指定位置創(chuàng)建一個單級文件夾醇滥,成功返回true黎比,存在就不創(chuàng)建返回false超营,上級目錄不存在返回false。
boolean mkdirs() 在指定位置遍歷創(chuàng)建多級文件夾阅虫,成功返回true糟描,存在就不創(chuàng)建返回false
boolean renameTo(String dest) 同一目錄下重命名指定文件或文件夾,不同目錄下為剪切文件(此時不可操作文件夾)书妻。
boolean delete() 立即刪除文件或者空文件夾船响。
boolean deleteOnExit() 發(fā)出刪除指令,當jvm退出的時候執(zhí)行刪除行為躲履,一般用于刪除臨時文件见间。
boolean exists() 指定文件或文件夾是否存在。
boolean isFile() 判斷是否是一個文件工猜。
boolean isDirectory() 判斷是否是一個文件夾米诉。
boolean isHidden() 是否是一個文件或文件夾
boolean isAbsolute() 是否為絕對路徑
String getName() 獲取為文件或文件名,不包含上級路徑篷帅。
String getPath() 返回絕對路徑
String getAbsolute() 獲取絕對路徑史侣,與文件存在與否無關
Long length() 獲取文件大小(以字節(jié)為單位)
String getParent() 返回父目錄路徑
Long lastModified() 獲取最后一次被修改的時間
static File[] listRoots() 列出所有根目錄
String[] list() 返回目錄下的所有文件名(包含隱藏文件)
String[] list(fileNameFilter filter) 返回指定目錄中符合過濾條件的子文件或子目錄.
File[] listFiles()? 返回目錄下的所有文件
File[] listFiles(FilenameFilter filter) 返回指定目錄中符合過濾條件的子文件或子目錄.
FilenameFilter:這是一個過濾器接口
IO流分類:
如果是按照數(shù)據(jù)的流向劃分:
輸入流
輸出流
如果按照處理的單位劃分:
字節(jié)流: 字節(jié)流讀取得都是文件中二進制數(shù)據(jù),讀取到二進制數(shù)據(jù)不會經(jīng)過任何的處理魏身。
字符流:字符流讀取的數(shù)據(jù)是以字符為單位的惊橱,字符流也是讀取文件中的二進制數(shù)據(jù),不過會把這些二進制數(shù)據(jù)轉換成我們能識別的字符箭昵。(字符流 = 字節(jié)流 + 解碼)
I0流體系
字節(jié)流:
---| InputStream 輸入流:所有輸入字節(jié)流的基類 (抽象類)
------| FileInputStream? 字節(jié)輸入流: 讀取文件數(shù)據(jù)的輸入字節(jié)流.
------| BufferedInputStream? 緩沖輸入字節(jié)流:內(nèi)部維護了一個8kb的數(shù)組,提高讀取文件數(shù)據(jù)的效率税朴。
------| ObjectInputStream 對象輸入流:
------| SequenceInputStream? 序列輸入流:
---| OutputStream 輸出流:是所有輸出字節(jié)流的父類(抽象類)
------| FileOutStream? 字節(jié)輸出流:向文件輸出數(shù)據(jù)的輸出字節(jié)流。
------| BufferedOutputStream 緩沖輸出字節(jié)流:內(nèi)部維護了一個8kb的數(shù)組,提高寫文件數(shù)據(jù)的效率
------| ObjectInputStream 對象輸出流:
------| PrintStream? 打印流: 打印流可以打印任意類型的數(shù)據(jù)家制,而且打印數(shù)據(jù)之前都會先把數(shù)據(jù)轉換成字符串再進行打印正林。
字符流:
---| Reader 輸入流:輸入字符流的基類(抽象類)
------| FileReader 字符輸入流:讀取文件的輸入字符流
------| BufferedReader? 緩沖輸入字符流:緩沖輸入字符流出現(xiàn)的目的是為了提高讀取文件的效率和拓展了FileReader的功能。
------| InputStreamReader
---| Writer 輸出字符流的基類(抽象類)
------| FileWriter 向文件數(shù)據(jù)數(shù)據(jù)的輸出字符流颤殴。
------| BufferedWriter 緩沖輸出字符流觅廓。
------| OutputStreamWriter
輸入字節(jié)流:
使用FileInputStream讀取文件數(shù)據(jù)的步驟:
1. 找到目標文件
2. 建立數(shù)據(jù)的輸入通道。
3. 讀取文件中的數(shù)據(jù)涵但。
4. 關閉資源.
輸出字節(jié)流:
FileOutputStream如何使用呢杈绸?
1. 找到目標文件
2. 建立數(shù)據(jù)的輸出通道。
3. 把數(shù)據(jù)轉換成字節(jié)數(shù)組寫出贤笆。
4. 關閉資源
FileOutputStream要注意的細節(jié):
1. 使用FileOutputStream的時候蝇棉,如果目標文件不存在讨阻,那么會自動創(chuàng)建目標文件對象芥永。
2. 使用FileOutputStream寫數(shù)據(jù)的時候,如果目標文件已經(jīng)存在钝吮,那么會先清空目標文件中的數(shù)據(jù)埋涧,然后再寫入數(shù)據(jù)板辽。
3. 使用FileOutputStream寫數(shù)據(jù)的時候, 如果目標文件已經(jīng)存在,需要在原來數(shù)據(jù)基礎上追加數(shù)據(jù)的時候應該使用new FileOutputStream(file,true)構造函數(shù)棘催,第二參數(shù)為true劲弦。
4. 使用FileOutputStream的write方法寫數(shù)據(jù)的時候,雖然接收的是一個int類型的數(shù)據(jù)醇坝,但是真正寫出的只是一個字節(jié)的數(shù)據(jù)邑跪,只是把低八位的二進制數(shù)據(jù)寫出,其他二十四位數(shù)據(jù)全部丟棄呼猪。
緩沖輸入字節(jié)流:
使用BufferedInputStream的步驟:
1. 找到目標文件画畅。
2. 建立數(shù)據(jù)的輸入通道
3. 建立緩沖輸入字節(jié)流
4. 關閉資源
注意:
1. BufferedInputStream出現(xiàn)的目的是了提高讀取文件的效率,但是緩沖流都不具備讀寫文件的能力,它要借助其它流的讀寫文件的能力宋距。
2. BufferedInputStream的read方法每次讀取一個字節(jié)的數(shù)據(jù)轴踱,
3. BufferedInputStream能提高效率的原因:讀取時會一次性把8kb數(shù)據(jù)讀入緩沖數(shù)組,然后每次都從數(shù)組中讀取一個字節(jié)谚赎,8kb數(shù)據(jù)讀完后淫僻,會再次將新的8kb數(shù)據(jù)放入緩沖數(shù)組。
4. 調(diào)用BufferedInputStream的close方法實際上關閉的是FileinputStream.
緩沖輸出字節(jié)流:
使用BufferedOutputStream的步驟:
1. 找到目標文件
2. 建立數(shù)據(jù)的輸出通道
3. 建立緩沖輸出字節(jié)流
4. 關閉資源
要注意的細節(jié):
1. 使用BufferedOutStream寫數(shù)據(jù)的時候壶唤,它的write方法是是先把數(shù)據(jù)寫到它內(nèi)部維護的字節(jié)數(shù)組中雳灵。
2. 如果需要把數(shù)據(jù)真正的寫到硬盤上面,需要調(diào)用flush方法或者是close方法闸盔、 或者是內(nèi)部維護的字節(jié)數(shù)組已經(jīng)填滿數(shù)據(jù)的時候细办。
FileReader
用法:
1. 找到目標文件
2. 建立數(shù)據(jù)的輸入通道
3. 讀取數(shù)據(jù)
4. 關閉資源
FileWriter
FileWriter的使用步驟:
1. 找到目標文件。
2. 建立數(shù)據(jù)輸出通道
3. 寫出數(shù)據(jù)蕾殴。
4. 關閉資源
FileWriter要注意的事項:
1. FileWriter內(nèi)部是維護了一個1024個字符數(shù)組的,使用它寫數(shù)據(jù)的時候笑撞,會先寫入到它內(nèi)部維護的字符數(shù)組中,如果需要把數(shù)據(jù)真正寫到硬盤上钓觉,需要調(diào)用flush或者是close方法或者是填滿了內(nèi)部的字符數(shù)組茴肥。
2. 使用FileWriter的時候,如果目標文件不存在荡灾,那么會自動創(chuàng)建目標文件瓤狐。
3. 使用FileWriter的時候,如果目標文件已經(jīng)存在了批幌,那么默認情況會先清空文件中的數(shù)據(jù)础锐,然后再寫入數(shù)據(jù),如果需要在原來的基礎上追加數(shù)據(jù)荧缘,需要使用“new FileWriter(File f, boolean b)”的構造方法皆警,第二參數(shù)為true。
BuffererReader
輸入字符流出現(xiàn)的目的是為了提高讀取文件的效率和拓展了FileReader的功能截粗。
其實該類內(nèi)部也是維護了一個8kb的字符數(shù)組.
BufferedReader的使用步驟:
1. 找到目標文件
2. 建立數(shù)據(jù)的輸入通道信姓。
3. 讀取數(shù)據(jù)
4. 關閉資源
經(jīng)典寫法
while((line = myReadLine(fileReader))!=null){
System.out.println(line);
}
BufferedWriter
BufferedWriter內(nèi)部只不過是提供了一個8192長度的字符數(shù)組作為緩沖區(qū)而已鸵隧,拓展了FileWriter的功能。
BufferedWriter使用:
1. 找到目標文件
2. 建立數(shù)據(jù)的輸出通道
3. 寫出數(shù)據(jù)
4. 關閉資源
SequenceInputStream
序列流創(chuàng)建步驟:
//1意推、創(chuàng)建文件
File file = new File("F:\\music");
//2豆瘫、創(chuàng)建文件輸入流
FileInputStream fos2 = new FileInputStream(file);
//3、創(chuàng)建Vector
Vector vector = new Vector();
//4菊值、將文件輸入流添加到Vector
vector.add(fos);
//5外驱、通過Vector獲取迭代器
Enumeration<FileInputStream> e = vector.elements();
//6、創(chuàng)建序列流
SequenceInputStream inputStream = new SequenceInputStream(e);
對象的輸入輸出流 : 對象的輸入輸出流主要的作用是用于寫對象的信息與讀取對象的信息腻窒。對象信息一旦寫到文件上那么對象的信息就可以做到持久化了
對象的輸出流:ObjectOutputStream
對象的輸入流: ObjectInputStream
對象輸入輸出流要注意的細節(jié):
1. 如果對象需要被寫出到文件上略步,那么對象所屬的類必須要實現(xiàn)Serializable接口。 Serializable接口沒有任何的方法定页,是一個標識接口而已趟薄。
2. 對象的反序列化創(chuàng)建對象的時候并不會調(diào)用到構造方法的
3. serialVersionUID 是用于記錄class文件的版本信息的,serialVersionUID這個數(shù)字是通過一個類的類名典徊、成員杭煎、包名、工程名算出的一個數(shù)字卒落。
4. 使用ObjectInputStream反序列化的時候羡铲,ObjeectInputStream會先讀取文件中的serialVersionUID,然后與本地的class文件的serialVersionUID進行對比儡毕,如果這兩個id不一致也切,那么反序列化就失敗了。
5. 如果序列化與反序列化的時候可能會修改類的成員腰湾,那么最好一開始就給這個類指定一個serialVersionUID雷恃,如果一類已經(jīng)指定的serialVersionUID,然后在序列化與反序列化的時候费坊,jvm都不會再自己算這個 class的serialVersionUID了倒槐。
6. 如果一個對象某個數(shù)據(jù)不想被序列化到硬盤上,可以使用關鍵字transient修飾附井。
7. 如果一個類維護了另外一個類的引用讨越,那么另外一個類也需要實現(xiàn)Serializable接口。
打印流
打印流可以打印任何類型的數(shù)據(jù)永毅,而且打印數(shù)據(jù)之前都會先把數(shù)據(jù)轉換成字符串再進行打印把跨。
主要應用:
改變標準輸出流:
PrintStream p = new PrintStream(new File(""));
System.setout(p);
收集異常日志信息:
File logFile = new File("logfile");
PrintStream logPrintStream = new PrintStream(new FileOutputStream(logFile,true));
try{
代碼區(qū)
}catch(Exception e){
//將異常寫入日志留
e.printStackTrace(logPrintStream);
}
轉換流:
這是字節(jié)流和字符流溝通的橋梁。
輸入字節(jié)流的轉換流:InputStreamReader? 可以把輸入字節(jié)流轉換為輸入字符流
輸出字節(jié)流的轉換流:OutputStreamWriter 可以把輸出字節(jié)流轉換成輸出字符流
轉換流的作用:
1. 如果目前所獲取到的是一個字節(jié)流需要轉換字符流使用沼死,這時候就可以使用轉換流着逐。
2. 使用轉換流可以指定編碼表進行讀寫文件。
編碼與解碼
編碼: 把看得懂的字符變成看不懂碼值這個過程我們稱作為編碼。
解碼: 把碼值查找對應的字符滨嘱,我們把這個過程稱作為解碼峰鄙。
String s = "中國a";
byte[] bytes = s.getBytes("gbk");//編碼
String s1 = new String(bytes,"gbk");//解碼
注意細節(jié):
1浸间、編碼與解碼的時候指定的碼表是unicode實際上就是用了utf-16.