隨機(jī)訪問文件

隨機(jī)訪問文件

文件操作

java.io 定義的大多數(shù)類都是流式操作吃环,但 File 類不是。它直接處理文件和文件系統(tǒng)洋幻。File 類沒有指定信息怎樣從文件讀取或向文件存儲(chǔ)郁轻;它描述了文件本身的屬性。File 對(duì)象用來獲取或處理與磁盤文件相關(guān)的信息文留,例如權(quán)限好唯,時(shí)間,日期和目錄路徑厂庇。此外渠啊,F(xiàn)ile 還瀏覽子目錄層次結(jié)構(gòu)。Java 中的目錄當(dāng)成 File 對(duì)待权旷,它具有附加的屬性——一個(gè)可以被 list( ) 方法檢測(cè)的文件名列表替蛉。

先看一看 File 的構(gòu)造方法:

//根據(jù) parent 抽象路徑名和 child 路徑名字符串創(chuàng)建一個(gè)新 File 實(shí)例。
File(File parent, String child)

//通過將給定路徑名字符串轉(zhuǎn)換為抽象路徑名來創(chuàng)建一個(gè)新 File 實(shí)例
File(String pathname)

// 根據(jù) parent 路徑名字符串和 child 路徑名字符串創(chuàng)建一個(gè)新 File 實(shí)例
File(String parent, String child)

//通過將給定的 file: URI 轉(zhuǎn)換為一個(gè)抽象路徑名來創(chuàng)建一個(gè)新的 File 實(shí)例
File(URI uri)

例如:

//一個(gè)目錄路徑參數(shù)
File f1 = new File("/Users/mumutongxue/");

//對(duì)象有兩個(gè)參數(shù)——路徑和文件名
File f2 = new File("/Users/mumutongxue/","a.bat");

//指向 f1 文件的路徑及文件名
File f3 = new File(f1,"a.bat");

再來看看File的一些方法

方法 說明
boolean canExecute() 測(cè)試應(yīng)用程序是否可以執(zhí)行此抽象路徑名表示的文件
boolean canRead() 測(cè)試應(yīng)用程序是否可以讀取此抽象路徑名表示的文件
boolean canWrite() 測(cè)試應(yīng)用程序是否可以修改此抽象路徑名表示的文件
int compareTo(File pathname) 按字母順序比較兩個(gè)抽象路徑名
boolean createNewFile() 當(dāng)且僅當(dāng)不存在具有抽象路徑名指定名稱的文件時(shí)拄氯,不可分地創(chuàng)建一個(gè)新的空文件
static File createTempFile(String prefix, String suffix, File directory) 在指定目錄中創(chuàng)建一個(gè)新的空文件躲查,使用給定的前綴和后綴字符串生成其名稱
static File createTempFile(String prefix, String suffix, File idrectory) 在指定目錄中創(chuàng)建一個(gè)新的空文件,使用給定的前綴和后綴字符串生成其名稱
boolean delete() 刪除此抽象路徑名表示的文件或目錄
void deleteOnExit() 在虛擬機(jī)終止時(shí)译柏,請(qǐng)求刪除此抽象路徑名表示的文件或目錄
boolean equals(Object obj) 測(cè)試此抽象路徑名與給定對(duì)象是否相等
boolean exists() 測(cè)試此抽象路徑名表示的文件或目錄是否存在
File getAbsoluteFile() 返回此抽象路徑名的絕對(duì)路徑名形式
String getAbsolutePath() 返回此抽象路徑名的絕對(duì)路徑名字符串
File getCanonicalFile() 返回此抽象路徑名的規(guī)范形式
String getCanonicalPath() 返回此抽象路徑名的規(guī)范名字符串
long getFreeSpace() 返回此抽象路徑名指定的分區(qū)中為分配的字節(jié)數(shù)
String getName() 返回由此抽象路徑名表示的文件或目錄的名稱
String getParent() 返回此抽象路徑名父目錄的路徑字符串镣煮;如果此路徑名沒有指定父目錄,則返回 null
File getParentFile() 返回此抽象路徑名父目錄的抽象路徑名鄙麦;如果此路徑名沒有指定父目錄典唇,則返回null
String getPath() 將此抽象路徑名轉(zhuǎn)換為一個(gè)路徑名字符串
long getTotalSpace() 返回此抽象路徑名指定的分區(qū)大小
long getUsableSpace() 返回此抽象路徑名指定的分區(qū)上可用于此虛擬機(jī)的字節(jié)數(shù)
int hashCode() 計(jì)算此抽象路徑名的哈希碼
boolean isAbsolute() 測(cè)試此抽象路徑名是否為絕對(duì)路徑名
boolean isDirectory() 測(cè)試此抽象路徑名表示的文件是否一個(gè)目錄
boolean isFile() 測(cè)試此抽象路徑名表示的文件是否是一個(gè)標(biāo)準(zhǔn)文件
boolean isHidden() 測(cè)試此抽象路徑名指定的文件是否是一個(gè)隱藏文件
long lastModified() 返回此抽象路徑名表示的文件最后一次被修改的時(shí)間
long length() 返回由此抽象路徑名表示的文件最后一次被修改的時(shí)間
String[] list() 返回一個(gè)字符串?dāng)?shù)組镊折,這些字符串指定此抽象路徑名表示的目錄中的文件和目錄
String[] list(FilenameFilter filter) 返回一個(gè)字符串?dāng)?shù)組,這些字符串指定此抽象路徑名表示的目錄中滿足指定過濾器的文件和目錄
File[] listFiles() 返回一個(gè)抽象路徑名數(shù)組介衔,這些路徑名表示此抽象路徑名表示的目錄中的文件
File[] listFiles(FileFiter filter) 返回抽象路徑名數(shù)組恨胚,這是路徑名表示此抽象路徑名表示的目錄中滿足指定過濾器的文件和目錄
File[] listFiles(FilenameFilter filter) 返回抽象路徑名數(shù)組, 這些路徑名表示此抽象路徑名表示的 目錄中滿足指定過濾器的文件和目錄
static File[] listRoots() 列出可用的文件系統(tǒng)根
boolean mkdir() 創(chuàng)建此抽象路徑名指定的目錄
boolean mkdirs() 創(chuàng)建此抽象路徑名指定的目錄炎咖,包括所有必須但不存在的父目錄
boolean renameTo(File dest) 重新命名此抽象路徑名表示的文件
boolean setExecutable(boolean executable) 設(shè)置此抽象路徑名所有者執(zhí)行權(quán)限的一個(gè)便捷方法
boolean setExecutable(boolean executable, boolean ownerOnly) 設(shè)置此抽象路徑名的所有者或所有用戶的執(zhí)行權(quán)限
boolean setLastModified(long time) 設(shè)置此抽象路徑名指定的文件或目錄的最后一次修改時(shí)間
boolean setReadable(boolean readable) 設(shè)置此抽象路徑名所有者讀權(quán)限的一個(gè)便攜方法
boolean setReadable(boolean readable, boolean ownerOnly) 設(shè)置此抽象路徑名的所有者或所有用戶的讀權(quán)限
boolean setReadOnly() 標(biāo)記此抽象路徑名指定的文件或目錄赃泡,從而只能對(duì)其進(jìn)行讀操作
boolean setWritable(boolean writable, boolean ownerOnly) 設(shè)置此抽象路徑名的所有者或所有用戶的寫權(quán)限
String toString() 返回此抽象路徑名的路徑名字符串
URI toURI() 構(gòu)造一個(gè)表示此抽象路徑名的file:URI

示例代碼

import java.io.File;
import java.io.IOException;

public class  FileDemo {
    public static void main(String[] args){
        //同學(xué)們可以根據(jù)自己的路徑進(jìn)行更改
        File f1 =new File("/home/project/1.txt");
        //File(String parent,String child)
        File f2 =new File("/home/project","2.txt");
        //separator 跨平臺(tái)分隔符
        File f3 =new File("/home"+File.separator+"project");
        File f4 =new File(f3,"3.txt");

        try {
             System.out.println(f1);
                //當(dāng)文件存在時(shí)返回 false;不存在時(shí)返回 true
                System.out.println(f2.createNewFile());
                //當(dāng)文件不存在時(shí)返回 false
                System.out.println(f3.delete());
        }catch(IOException e) {
                e.printStackTrace();
        }

        //列出磁盤下的文件和文件夾
        File[] files =File.listRoots();
        for(File file:files){
            System.out.println(file);
            if(file.length()>0){
                String[] filenames =file.list();
                for(String filename:filenames){
                    System.out.println(filename);
                }
            }
        }

    }

}

隨機(jī)訪問文件

對(duì)于 FileInputStream/FileOutputStream乘盼、FileReader/FileWriter 來說升熊,它們的實(shí)例都是順序訪問流,即只能進(jìn)行順序讀/寫绸栅。而類 RandomAccessFile 則允許文件內(nèi)容同時(shí)完成讀和寫操作级野,它直接繼承 object,并且同時(shí)實(shí)現(xiàn)了接口 DataInput 和 DataOutput阴幌。

隨機(jī)訪問文件的行為類似存儲(chǔ)在文件系統(tǒng)中的一個(gè)大型 byte 數(shù)組勺阐。存在指向該隱含數(shù)組的光標(biāo)或索引,稱為文件指針矛双;輸入操作從文件指針開始讀取字節(jié),并隨著對(duì)字節(jié)的讀取而前移此文件指針蟆豫。如果隨機(jī)訪問文件以讀取/寫入模式創(chuàng)建议忽,則輸出操作也可用;輸出操作從文件指針開始寫入字節(jié)十减,并隨著對(duì)字節(jié)的寫入而前移此文件指針栈幸。

RandomAccessFile 提供了支持隨機(jī)文件操作的方法:

  1. readXXX() 或者 writeXXX(): 如 ReadInt(),ReadLine(),WriteChar(),WriteDouble() 等
  2. int skipBytes(int n): 將指針向下移動(dòng)若干字節(jié)
  3. length(): 返回文件長(zhǎng)度
  4. long getFilePointer(): 返回指針當(dāng)前位置
  5. void seek(long pos): 將指針調(diào)用所需位置

在生成一個(gè)隨機(jī)文件對(duì)象時(shí),除了要指定文件對(duì)象和文件名之外帮辟,還需要指明訪問文件的模式速址。

我們來看看RandomAccessFile的構(gòu)造方法:

RandomAccessFile(File file,String mode)
RandomAccessFile(String name,String mode)

mode 的取值:

  • r: 只讀,任何寫操作都講拋出 IOException
  • rw: 讀寫由驹,文件不存在時(shí)會(huì)創(chuàng)建該文件芍锚,文件存在是,原文件內(nèi)容不變蔓榄,通過寫操作改變文件內(nèi)容并炮。
  • rws: 打開以便讀取和寫入,對(duì)于 "rw"甥郑,還要求對(duì)文件的內(nèi)容或元數(shù)據(jù)的每個(gè)更新都同步寫入到底層存儲(chǔ)設(shè)備逃魄。
  • rwd: 打開以便讀取和寫入,對(duì)于 "rw"澜搅,還要求對(duì)文件內(nèi)容的每個(gè)更新都同步寫入到底層存儲(chǔ)設(shè)備伍俘。

例子:

import java.io.IOException;
import java.io.RandomAccessFile;

public class  FileDemo {
    public static void main(String[] args){

            int data_arr[] = {12, 32, 43, 45, 1, 5};
            try {
                RandomAccessFile randf=new RandomAccessFile("temp.dat","rw");
                for(int i = 0; i < data_arr.length; i++){
                    randf.writeInt(data_arr[i]);
                }
                for(int i = data_arr.length-1 ; i >= 0; i--){
                    //int 數(shù)據(jù)占 4 個(gè)字節(jié)
                    randf.seek(i * 4L);
                    System.out.println(randf.readInt());
                }
                randf.close();
            }catch(IOException e){
                System.out.println("File access error" + e);
            }
    }
}

參考鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末邪锌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子癌瘾,更是在濱河造成了極大的恐慌觅丰,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柳弄,死亡現(xiàn)場(chǎng)離奇詭異舶胀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)碧注,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門嚣伐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萍丐,你說我怎么就攤上這事轩端。” “怎么了逝变?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵基茵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我壳影,道長(zhǎng)拱层,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任宴咧,我火速辦了婚禮根灯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掺栅。我一直安慰自己烙肺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布氧卧。 她就那樣靜靜地躺著桃笙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沙绝。 梳的紋絲不亂的頭發(fā)上搏明,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音宿饱,去河邊找鬼熏瞄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谬以,可吹牛的內(nèi)容都是我干的强饮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼为黎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼邮丰!你這毒婦竟也來了行您?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤剪廉,失蹤者是張志新(化名)和其女友劉穎娃循,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斗蒋,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捌斧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泉沾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捞蚂。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖跷究,靈堂內(nèi)的尸體忽然破棺而出姓迅,到底是詐尸還是另有隱情,我是刑警寧澤俊马,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布丁存,位于F島的核電站,受9級(jí)特大地震影響柴我,放射性物質(zhì)發(fā)生泄漏解寝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一艘儒、第九天 我趴在偏房一處隱蔽的房頂上張望编丘。 院中可真熱鬧,春花似錦彤悔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卵佛,卻和暖如春杨赤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背截汪。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工疾牲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衙解。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓阳柔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蚓峦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舌剂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • 1.File類的靜態(tài)成員變量: 1.static String pathSeparator 與系統(tǒng)有關(guān)的路...
    哦00閱讀 655評(píng)論 0 0
  • 1.File類的靜態(tài)成員變量: 1.static String pathSeparator 與系統(tǒng)有關(guān)的路...
    零點(diǎn)145閱讀 272評(píng)論 0 0
  • 五济锄、IO流 1、IO流概述 (1)用來處理設(shè)備(硬盤霍转,控制臺(tái)荐绝,內(nèi)存)間的數(shù)據(jù)。(2)java中對(duì)數(shù)據(jù)的操作都是通過...
    佘大將軍閱讀 508評(píng)論 0 0
  • Class Overview (類概述) 一個(gè)由路徑名確定文件系統(tǒng)實(shí)體的“抽象”表示避消。這個(gè)路徑名可能是絕對(duì)路徑(相...
    叁點(diǎn)水閱讀 451評(píng)論 0 0
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,381評(píng)論 0 5