IO技術主要的作用是解決設備與設備之間的數(shù)據(jù)傳輸問題

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.

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
禁止轉載太雨,如需轉載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末魁蒜,一起剝皮案震驚了整個濱河市囊扳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兜看,老刑警劉巖锥咸,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異细移,居然都是意外死亡搏予,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門弧轧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雪侥,“玉大人,你說我怎么就攤上這事精绎∷儆В” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵代乃,是天一觀的道長旬牲。 經(jīng)常有香客問我,道長搁吓,這世上最難降的妖魔是什么原茅? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮堕仔,結果婚禮上员咽,老公的妹妹穿的比我還像新娘。我一直安慰自己贮预,他們只是感情好贝室,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仿吞,像睡著了一般滑频。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唤冈,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天峡迷,我揣著相機與錄音,去河邊找鬼。 笑死绘搞,一個胖子當著我的面吹牛彤避,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夯辖,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼琉预,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蒿褂?” 一聲冷哼從身側響起圆米,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啄栓,沒想到半個月后娄帖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡昙楚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年近速,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堪旧。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡削葱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出崎场,到底是詐尸還是另有隱情佩耳,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布谭跨,位于F島的核電站干厚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏螃宙。R本人自食惡果不足惜蛮瞄,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谆扎。 院中可真熱鬧挂捅,春花似錦、人聲如沸堂湖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽无蜂。三九已至伺糠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斥季,已是汗流浹背训桶。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工累驮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舵揭。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓谤专,卻偏偏與公主長得像,于是被迫代替她去往敵國和親午绳。 傳聞我的和親對象是個殘疾皇子置侍,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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