系統(tǒng)學習 Java IO (四)----文件的讀寫和隨機訪問 FileInputStream/FileOutputStream & RandomAccessFile

目錄:系統(tǒng)學習 Java IO---- 目錄郭怪,概覽

文件輸入流 FileInputStream

這是一個簡單的FileInputStream示例:

InputStream input = new FileInputStream("D:\\input.txt");
int data = input.read();
while(data != -1) {
  //do something with data...
  doSomethingWithData(data);
  data = input.read();
}
input.close();

注意:為了代碼清晰,這里并沒有考慮處理異常的情況凑术,IO 異常處理有專門的介紹。

FileInputStream 構造器

FileInputStream 類有三個不同的構造函數(shù)所意,可用于創(chuàng)建 FileInputStream 實例。

  • 構造函數(shù)將一個包含文件系統(tǒng)中要讀取的文件所在的路徑 String 作為參數(shù): FileInputStream fileInputStream = new FileInputStream( "D:\\1.txt");
    注意路徑需要雙反斜杠\\,因為反斜杠是Java字符串中的轉義字符催首,通過此方式獲得單個反斜杠扶踊。
    在unix上,文件路徑可能如下所示:
    String path = "/home/czwbig/data/thefile.txt";
    注意使用正斜杠/作為目錄分隔符郎任。 這是在 unix 上編寫文件路徑的方法秧耗。 實際上,Java 也會理解在 Windows 上使用/作為目錄分隔符,例如new FileInputStream("D:/out.txt")

  • 構造函數(shù)將 File 對象作為參數(shù)舶治。 File 對象必須指向要讀取的文件分井。 這是一個例子:

String path = "D:\\out.txt";
File   file = new File(path);
FileInputStream fileInputStream = new FileInputStream(file);

應該使用哪個構造函數(shù)取決于在打開 FileInputStream 之前具有該路徑的形式车猬。 如果您已經有一個 String 或 File ,只需按原樣使用它尺锚。 將 String 轉換為 File 或將 File 轉換為 String 沒有特別的好處珠闰。

  • public FileInputStream(FileDescriptor fdObj)
    通過使用文件描述符 fdObj 創(chuàng)建一個 FileInputStream,該文件描述符表示到文件系統(tǒng)中某個實際文件的現(xiàn)有連接瘫辩。不常用伏嗜。
read(byte[])

作為 InputStream 的子類,F(xiàn)ileInputStream 還有兩個 read() 方法伐厌,可以將數(shù)據(jù)讀入字節(jié)數(shù)組承绸。 可以在我的有關 InputStream 的文章中閱讀,不展開了挣轨。

close()

建議使用 try 自動關閉军熏,參考 IO 異常處理章節(jié)。


文件輸出流 FileOutputStream

這是一個簡單的 FileOutputStream 示例:

OutputStream output = new FileOutputStream("D:\\out.txt");
while(moreData) {
  int data = getMoreData();
  output.write(data);
}
output.close();
FileOutputStream 構造器

和 FileInputStream 的 3 個構造器差不多卷扮,參考上面即可荡澎。
另外多了兩個構造方法:

  • FileOutputStream(File file, boolean append) ;
  • FileOutputStream(String name, boolean append) ;
    參數(shù) append :如果不給出 append 參數(shù),其值默認是 false 的画饥,即默認是覆蓋模式衔瓮。如果為 true,則將字節(jié)寫入文件末尾處抖甘,而不是寫入文件開始處热鞍,這樣就能不覆蓋文件,而是追加內容衔彻。
    所以薇宠,在新建 FileOutputStream 對象的時候,要非常小心艰额,只要沒有指定 append 為 true 澄港,那么只要 FileOutputStream 對象創(chuàng)建成功,對應的文件會被立即清空柄沮。
    如代碼:OutputStream outputStream = new FileOutputStream("D:\\test\\1.txt"); 回梧,執(zhí)行后對應的 1.txt 文件(如果存在)會立刻被清空,而不管有沒有調用 OutputStream 的 write() 方法祖搓。
write(...) and flush()

參考 OutputStream 狱意。

使用 RandomAccessFile 隨機訪問文件

這里的隨機訪問是指,指定任何一個位置拯欧,都能夠訪問它详囤;而不是不確定的隨機訪問某一個位置。
在使用 RandomAccessFile 類之前镐作,必須實例化它藏姐。它有兩個構造器隆箩,如下:

  1. RandomAccessFile(File file, String mode)
  2. RandomAccessFile(String name, String mode)

實例:

RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw");

參數(shù):
file、name- 該文件對象
mode - 訪問模式羔杨,如下表:

含意
"r" 以只讀方式打開捌臊。調用結果對象的任何 write 方法都將導致拋出 IOException。
"rw" 打開以便讀取和寫入问畅。如果該文件尚不存在娃属,則嘗試創(chuàng)建該文件。
"rws" "rw" + “sync”护姆,另外還要求對文件的內容或元數(shù)據(jù)的每個更新都同步寫入到底層存儲設備矾端。
"rwd" "rw" + “data”,另外還要求對文件內容的每個更新都同步寫入到底層存儲設備卵皂。
"rwd" 模式

可用于減少執(zhí)行的 I/O 操作數(shù)量.使用 "rwd" 僅要求更新要寫入存儲的文件的內容秩铆;使用 "rws" 要求更新要寫入的文件內容及其元數(shù)據(jù),這通常要求至少一個以上的低級別 I/O 操作灯变。

"rws" 和 "rwd" 模式

如果該文件位于本地存儲設備上殴玛,那么當返回此類的一個方法的調用時,可以保證由該調用對此文件所做的所有更改均被寫入該設備添祸。這對確保在系統(tǒng)崩潰時不會丟失重要信息特別有用滚粟。如果該文件不在本地設備上,則無法提供這樣的保證刃泌。

在文件中跳轉

要在 RandomAccessFile 中的特定位置讀取或寫入凡壤,必須首先將文件指針放在要讀取或寫入的位置。 這是使用 seek() 方法完成的耙替。 可以通過調用 getFilePointer() 方法獲取文件指針的當前位置亚侠。
read() 方法將文件指針遞增為指向剛剛讀取的字節(jié)后文件中的下一個字節(jié)! 這意味著可以繼續(xù)調用 read() 而無需手動移動文件指針俗扇。
看如下例子:

public class RandomAccessFileExample {
    public static void main(String[] args) throws IOException {
        // out.txt 此時的文件內容為 "123456789"
        RandomAccessFile file = new RandomAccessFile("D:\\out.txt", "rw");

        System.out.println("pointer: " + file.getFilePointer()); // 輸出 pointer: 0
        System.out.println("char: " + (char) file.read()); // 輸出 char: 1
        System.out.println("pointer: " + file.getFilePointer()); // 輸出 pointer: 1

        file.seek(4); // 下標從 0 開始的硝烂,讓其指向第 5 個字節(jié)

        System.out.println("pointer: " + file.getFilePointer()); // 輸出 pointer: 4
        System.out.println("char: " + (char) file.read()); // 輸出 char: 5
        System.out.println("pointer: " + file.getFilePointer()); // 輸出 pointer: 5
        file.close();
    }
}
read & write

從 RandomAccessFile 讀取是使用其眾多 read() 方法之一完成的。

方法 描述
read(byte[] b) 將最多 b.length 個數(shù)據(jù)字節(jié)從此文件讀入 byte 數(shù)組铜幽。
readByte() 從此文件讀取一個有符號的八位值滞谢。
readChar() 從此文件讀取一個字符。
readFully(byte[] b) 將 b.length 個字節(jié)從此文件讀入 byte 數(shù)組除抛,并從當前文件指針開始爹凹。
readLine() 從此文件讀取文本的下一行。
skipBytes(int n) 嘗試跳過輸入的 n 個字節(jié)以丟棄跳過的字節(jié)镶殷。
setLength(long newLength) 設置此文件的長度。
writeChars(String s) 按字符序列將一個字符串寫入該文件微酬。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末绘趋,一起剝皮案震驚了整個濱河市颤陶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陷遮,老刑警劉巖滓走,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異帽馋,居然都是意外死亡搅方,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門绽族,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姨涡,“玉大人,你說我怎么就攤上這事吧慢√纹” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵检诗,是天一觀的道長匈仗。 經常有香客問我,道長逢慌,這世上最難降的妖魔是什么悠轩? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮攻泼,結果婚禮上火架,老公的妹妹穿的比我還像新娘。我一直安慰自己坠韩,他們只是感情好距潘,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著只搁,像睡著了一般音比。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氢惋,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天洞翩,我揣著相機與錄音,去河邊找鬼焰望。 笑死骚亿,一個胖子當著我的面吹牛,可吹牛的內容都是我干的熊赖。 我是一名探鬼主播来屠,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了俱笛?” 一聲冷哼從身側響起捆姜,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迎膜,沒想到半個月后泥技,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡磕仅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年珊豹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榕订。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡店茶,死狀恐怖,靈堂內的尸體忽然破棺而出卸亮,到底是詐尸還是另有隱情忽妒,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布兼贸,位于F島的核電站段直,受9級特大地震影響,放射性物質發(fā)生泄漏溶诞。R本人自食惡果不足惜鸯檬,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望螺垢。 院中可真熱鬧喧务,春花似錦、人聲如沸枉圃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孽亲。三九已至坎穿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間返劲,已是汗流浹背玲昧。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留篮绿,地道東北人孵延。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像亲配,于是被迫代替她去往敵國和親尘应。 傳聞我的和親對象是個殘疾皇子惶凝,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內容

  • 概述 java.io 包幾乎包含了所有操作輸入、輸出需要的類菩收。所有這些流類代表了輸入源和輸出目標梨睁。java.io ...
    Steven1997閱讀 9,183評論 1 25
  • 五、IO流 1娜饵、IO流概述 (1)用來處理設備(硬盤,控制臺官辈,內存)間的數(shù)據(jù)箱舞。(2)java中對數(shù)據(jù)的操作都是通過...
    佘大將軍閱讀 504評論 0 0
  • 1、IO流 1.1拳亿、概述 之前學習的File類它只能操作文件或文件夾晴股,并不能去操作文件中的數(shù)據(jù)。真正保存數(shù)據(jù)的是文...
    Villain丶Cc閱讀 2,660評論 0 5
  • 對于我這種不喜歡在人前說話的來說肺魁,在虛擬的世界里也許說得會多一點电湘,但是同學群我總是很少發(fā)言,其實也不是怕說錯什么鹅经,...
    逸媽媽閱讀 360評論 0 0
  • 今天這篇文章將是我之前挖下的坑被填平的一天寂呛,在9月14號的時候,我曾經寫下一篇文章“寫的文章沒人看瘾晃,還要不要寫贷痪?”...
    島嶼書閱讀 700評論 12 7