精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

高效快捷讀寫文件之 RandomAccessFile 類解說

開發 前端
本文主要圍繞 RandomAccessFile 類的基本概念和常用方法,做了一次簡單的知識總結,該類是 IO 流體系中功能最豐富的文件內容訪問類,既可以讀取文件中任意位置的內容,也可以向文件任意位置寫入數據。

一、摘要

RandomAccessFile 類,也被稱為隨機訪問文件類。

RandomAccessFile 可以說是 Java 體系中功能最為豐富的文件操作類,相比之前介紹的通過字節流或者字符流接口方式讀寫文件,RandomAccessFile 類可以跳轉到文件的任意位置處進行讀寫數據,而無需把文件從頭讀到尾,但是該類僅限于操作文件,不能訪問其他的 IO 設備,如網絡、內存映像等。

所以如果需要訪問文件的部分內容,而不是把文件從頭讀到尾,使用 RandomAccessFile 將是更好的選擇。

實際上,雖然RandomAccessFile類具備隨機讀寫數據的功能,但是它既不是InputStream的子類,也不是OutputStream的子類,絕大部分的方法都是從零開始寫的,這可能是因為  RandomAccessFile 需要在文件里面前后移動,它的行為與其它的 I/O 類有著根本性的不同,所以相對比較獨立。

RandomAccessFile對象類中內置了一個位置指示器,可以指向當前讀寫處的位置,當讀寫 n 個字節后,文件指示器將指向這 n 個字節后的下一個字節處。剛打開文件時,文件指示器指向文件的開頭處,當移動文件指示器到新的位置時,隨后的讀寫將從新的位置開始,這是它與其他的文件讀寫方式最大的不同。

基本上,RandomAccessFile的工作方式是,結合DataInputStream和DataOutputStream類完成數據的讀寫,再加上自己的一些方法,比如定位用的 getFilePointer方法,在文件里移動用的seek方法,以及判斷文件大小length方法、跳過多少字節數的skipBytes方法等,來完成文件的隨機訪問和讀寫操作。

具體怎么使用呢,我們一起來看看!

二、RandomAccessFile 類基本介紹

下面先來看看一個簡單的例子。

// 獲取隨機訪問文件對象
RandomAccessFile raf = new RandomAccessFile(new File("randomFileDemo.txt"), "rw");
for (int i = 0; i < 10; i++) {
    // 寫入數據,1個int占4個字節
    raf.writeInt(i);
}
raf.close();

System.out.println("================修改前的內容===============" );
// 重新獲取隨機訪問文件對象
raf = new RandomAccessFile(new File("randomFileDemo.txt"), "rw");
for (int i = 0; i < 10; i++) {
    System.out.println("Value:" + i + ": " + raf.readInt());
}
raf.close();

// 重新獲取隨機訪問文件對象
raf = new RandomAccessFile(new File("randomFileDemo.txt"), "rw");
// 設置文件指針偏移量,從0開始,直接將文件指針移到第6個int數據后面(1個int占4個字節)
raf.seek(5 * 4);
//覆蓋第6個int數據
raf.writeInt(16);
raf.close();

System.out.println("================修改后的內容===============" );
// 重新獲取隨機訪問文件對象
raf = new RandomAccessFile(new File("randomFileDemo.txt"), "rw");
for (int i = 0; i < 10; i++) {
    System.out.println("Value:" + i + ": " + raf.readInt());
}
raf.close();

輸出結果:

================修改前的內容===============
Value:0: 0
Value:1: 1
Value:2: 2
Value:3: 3
Value:4: 4
Value:5: 5
Value:6: 6
Value:7: 7
Value:8: 8
Value:9: 9
================修改后的內容===============
Value:0: 0
Value:1: 1
Value:2: 2
Value:3: 3
Value:4: 4
Value:5: 16
Value:6: 6
Value:7: 7
Value:8: 8
Value:9: 9

RandomAccessFile類為用戶提供了兩種構造方法,具體操作方式如下:

// 第一種構造方法:指定 file 對象和讀寫模式
RandomAccessFile raf = new RandomAccessFile(File file, String mode);

// 第二種構造方法:指定 filename 路徑和讀寫模式
RandomAccessFile raf = new RandomAccessFile(String filename, String mode);

其實第二種構造方法也是new File()出來,再調用第一種構造方法,兩者都可以獲取隨機訪問文件對象。

至于mode,表示以何種方式打開文件,Java給開發者提供了四種mode值,具體解釋如下!

圖片圖片

值得注意的地方是,**"rw"模式下,Java 并不強求指定的路徑下一定存在某個文件,假如文件不存在,會自動創建**。

RandomAccessFile類為用戶提供的方法比較多,我們可以關注下幾個重要的方法即可,詳細方法如下圖!

圖片圖片

方法的使用,可以參考如下樣例:

RandomAccessFile file = new RandomAccessFile("file.txt", "rw");
// 以下向file文件中寫數據
file.writeInt(20);// 占4個字節
file.writeDouble(8.236598);// 占8個字節
file.writeUTF("這是一個UTF字符串");// 這個長度寫在當前文件指針的前兩個字節處,可用readShort()讀取
file.writeBoolean(true);// 占1個字節
file.writeShort(395);// 占2個字節
file.writeLong(2325451L);// 占8個字節
file.writeUTF("又是一個UTF字符串");
file.writeFloat(35.5f);// 占4個字節
file.writeChar('a');// 占2個字節

file.seek(0);// 把文件指針位置設置到文件起始處

// 以下從file文件中讀數據,要注意文件指針的位置
System.out.println("——————從file文件指定位置讀數據——————");
System.out.println(file.readInt());
System.out.println(file.readDouble());
System.out.println(file.readUTF());

file.skipBytes(3);// 將文件指針跳過3個字節,本例中即跳過了一個boolean值和short值。
System.out.println(file.readLong());

file.skipBytes(file.readShort()); // 跳過文件中“又是一個UTF字符串”所占字節,注意readShort()方法會移動文件指針,所以不用加2。
System.out.println(file.readFloat());

//以下演示文件復制操作
System.out.println("——————文件復制(從file到fileCopy)——————");
file.seek(0);
RandomAccessFile fileCopy=new RandomAccessFile("fileCopy.txt","rw");
int len=(int)file.length();//取得文件長度(字節數)
byte[] b=new byte[len];
file.readFully(b);//讀取全部內容
fileCopy.write(b);//全部寫入目標文件
System.out.println("復制完成!");

根據以上的方法介紹,我們可以利用RandomAccessFile實現一個在任意位置插入數據的操作,具體實例如下:

public class RandomAccessFileTest1 {

    /**
     * 插入數據
     * @param skip 跳過多少過字節進行插入數據
     * @param str 要插入的字符串
     * @param fileName 文件路徑
     */
    public static void insert(long skip, String str, String fileName){
        try {
            RandomAccessFile raf = new RandomAccessFile(fileName,"rw");
            if(skip <  0 || skip > raf.length()){
                System.out.println("跳過字節數無效");
                return;
            }
            byte[] b = str.getBytes();
            raf.setLength(raf.length() + b.length);
            // 將尾部數據進行遷移
            for(long i = raf.length() - 1; i > b.length + skip - 1; i--){
                raf.seek(i - b.length);
                byte temp = raf.readByte();
                raf.seek(i);
                raf.writeByte(temp);
            }
            // 從指定的位置,開始覆寫數據
            raf.seek(skip);
            raf.write(b);
            raf.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 方法測試
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) {
        insert(0, "一起學習Java", "test.txt");
        insert(0, "Hello,", "test.txt");
    }
}

文件內容結果如下:

Hello,一起學習Java

三、RandomAccessFile 類的應用

在實際的開發過程中,RandomAccessFile 的一個重要應用場景就是網絡請求中的文件多線程下載及斷點續傳。

首先將文件分成幾塊,然后每塊用不同的線程進行下載,下面是一個利用多線程在寫文件時的例子:

public class RandomAccessFileTest2 {

    public static void main(String[] args) throws Exception {
        // 預分配文件所占的磁盤空間,磁盤中會創建一個指定大小的文件
        RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
        raf.setLength(1024*1024); // 預分配 1M 的文件空間
        raf.close();

        // 所要寫入的文件內容
        String s1 = "第一個字符串";
        String s2 = "第二個字符串";
        String s3 = "第三個字符串";
        String s4 = "第四個字符串";
        String s5 = "第五個字符串";

        // 利用多線程同時寫入一個文件
        new FileWriteThread(1024*1,s1.getBytes()).start(); // 從文件的1024字節之后開始寫入數據
        new FileWriteThread(1024*2,s2.getBytes()).start(); // 從文件的2048字節之后開始寫入數據
        new FileWriteThread(1024*3,s3.getBytes()).start(); // 從文件的3072字節之后開始寫入數據
        new FileWriteThread(1024*4,s4.getBytes()).start(); // 從文件的4096字節之后開始寫入數據
        new FileWriteThread(1024*5,s5.getBytes()).start(); // 從文件的5120字節之后開始寫入數據
    }
}

class FileWriteThread extends Thread{
    private int skip;
    private byte[] content;

    public FileWriteThread(int skip,byte[] content){
        this.skip = skip;
        this.content = content;
    }

    @Override
    public void run(){
        RandomAccessFile raf = null;
        try {
            // 利用線程在文件的指定位置寫入指定數據
            raf = new RandomAccessFile("test.txt", "rw");
            raf.seek(skip);
            raf.write(content);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                raf.close();
            } catch (Exception e) {
            }
        }
    }
}

四、小結

本文主要圍繞 RandomAccessFile 類的基本概念和常用方法,做了一次簡單的知識總結,該類是 IO 流體系中功能最豐富的文件內容訪問類,既可以讀取文件中任意位置的內容,也可以向文件任意位置寫入數據。

當然 RandomAccessFile 當讀寫大文件的時候,會出現內存溢出問題,此時可以采用內存映射文件方式進行讀寫數據,關于技術會在后期的文章中進行介紹。

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2010-01-27 16:41:43

2014-12-26 20:46:18

惠普HP Mobile C

2016-01-08 19:34:14

新東方

2024-08-23 09:06:26

2010-03-04 16:42:59

2010-07-16 10:42:14

telnet批處理

2010-08-30 20:18:28

DHCP服務器

2009-12-31 11:27:33

2021-02-26 20:55:56

JavaNIO隨機

2021-07-19 09:51:55

智能語音移動云

2021-08-05 10:00:02

Python編程語言

2010-02-25 14:50:59

Linux文件系統

2021-07-15 10:14:37

網絡安全漏洞攻擊

2011-10-21 09:06:41

Better Net銳捷網絡

2009-12-22 10:05:00

Linux文件系統

2021-04-02 06:35:49

Bash讀寫文件Linux

2013-05-27 10:58:10

propertiesJava語言

2010-11-19 11:32:25

Oracle存儲過程

2010-07-16 09:06:57

Perl文件
點贊
收藏

51CTO技術棧公眾號

国产精品欧美久久久久无广告 | 美女被久久久| 精品一区电影国产| 午夜免费看毛片| 免费看电影在线| 国产香蕉久久精品综合网| 成人中文字幕+乱码+中文字幕| 国产精品第九页| 第一sis亚洲原创| 欧美xingq一区二区| 能在线观看的av网站| 91涩漫在线观看| gogogo免费视频观看亚洲一| 国产美女被下药99| 亚洲精品国产精品乱码| 欧美激情理论| 亚洲欧美日韩精品久久| 国产乱国产乱老熟300部视频| 91精品影视| 五月天亚洲婷婷| 手机成人av在线| 韩国免费在线视频| 99麻豆久久久国产精品免费优播| 国产日本欧美一区| 日日噜噜噜噜人人爽亚洲精品| 中文字幕一区二区三区四区久久| 精品午夜电影| 色综合网站在线| 欧美国产视频一区| 五月天婷婷在线视频| 97精品久久久午夜一区二区三区 | 成人精品视频在线观看| 岛国视频午夜一区免费在线观看| 国产资源第一页| 五月香视频在线观看| 国产亚洲一区二区三区| 久久久久久久久久久一区| 性中国xxx极品hd| 国内精品伊人久久久久av影院| 国产激情视频一区| 久久久精品免费看| 亚洲精品在线二区| 午夜精品一区二区三区在线| 久操免费在线视频| 雨宫琴音一区二区三区| 日韩在线观看网站| 波多野结衣一二三四区| 精品国产a一区二区三区v免费| 日韩精品丝袜在线| yjizz视频| 中文在线免费一区三区| 日韩欧美国产一区在线观看| 日本一二三区在线| 日韩欧美中文在线观看| 日韩一区二区在线看| 国产人妻精品久久久久野外| 亚洲黑人在线| 欧美一区二区三区电影| 午夜一级免费视频| 国产精品一区二区美女视频免费看| 欧美久久久久久久久中文字幕| 不卡的av中文字幕| 91成人精品观看| 777午夜精品视频在线播放| 五月天激情播播| 高清久久一区| 精品美女一区二区| 中文字幕无码人妻少妇免费| 日韩高清成人在线| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 国产主播精品在线| 精品国精品国产自在久不卡| 国产成人在线影院| 国产精品一区在线播放| 男人天堂综合| 国产精品福利电影一区二区三区四区 | 午夜免费看视频| 精品久久亚洲| 亚洲精品999| 自拍偷拍你懂的| 欧美va亚洲va日韩∨a综合色| 久久久久久久久久婷婷| 东京热一区二区三区四区| 日韩精品视频网| 91在线中文字幕| 天天操天天射天天| 国产精品美女久久久久av爽李琼| 亚洲黄色网址在线观看| 人在线成免费视频| 欧美久久久久久久久久| 800av在线播放| 欧美丝袜激情| 欧美精品videosex性欧美| av黄色在线播放| 韩国av一区二区| 九色91在线视频| 激情成人四房播| 狠狠躁夜夜躁人人爽超碰91| 毛片毛片毛片毛| 日韩大尺度在线观看| 久久手机免费视频| 亚洲天堂一区在线| 国产精品99久久久久| 欧美亚洲精品日韩| 丝袜综合欧美| 欧美日韩三级视频| 最近中文字幕无免费| 亚洲91视频| 日韩av观看网址| 男人天堂网在线视频| 国产精品久久午夜| 欧洲av无码放荡人妇网站| 欧美视频二区欧美影视| 伊人av综合网| 亚洲成人第一网站| www.日本不卡| 国产制服91一区二区三区制服| 午夜无码国产理论在线| 亚洲成年人影院在线| 亚洲综合视频网站| 秋霞午夜鲁丝一区二区老狼| 蜜桃精品久久久久久久免费影院 | 国产精品v日韩精品| 免费a级片在线观看| 中文字幕一区二区三区av| 亚洲欧洲高清在线| 在线观看你懂的视频| 日韩理论电影大全| 欧洲亚洲在线视频| 特黄视频在线观看| 亚洲国产综合色| 九九九久久久久久久| 日韩不卡一区| 国产精品女主播| 国产三级电影在线观看| 欧美性猛xxx| 中文字幕一区二区久久人妻网站 | 久久亚洲精华国产精华液| 欧美日韩福利在线| 99精品中文字幕在线不卡| xxxx性欧美| 国产精品爽爽久久久久久| 国产欧美日韩精品a在线观看| 国产精品一区二区免费在线观看| 99re6热只有精品免费观看| 欧美黑人性视频| 丰满熟女一区二区三区| 亚洲一区影音先锋| 国产免费a级片| 影音先锋亚洲精品| 国产区日韩欧美| 牛牛精品一区二区| 亚洲精品一区二区在线| 免费黄色片视频| 国产亚洲精久久久久久| 爱情岛论坛成人| 亚洲GV成人无码久久精品| 日韩欧美高清在线播放| 国产免费亚洲高清| 免费大片黄在线观看视频网站| 7878成人国产在线观看| 亚洲国产精品久| 国产成人aaaa| 大肉大捧一进一出好爽视频| 蜜桃tv一区二区三区| 国产成人精品免高潮在线观看| 国产精品二线| 8v天堂国产在线一区二区| 美女视频黄免费| 久久夜色精品一区| www.亚洲高清| 欧美日韩一区二区国产| 国产综合av一区二区三区| 电影天堂国产精品| 久久久久北条麻妃免费看| 亚洲AV无码一区二区三区性| 狠狠做深爱婷婷久久综合一区 | 91色国产在线| 91成人观看| 国产伦精品一区二区三| 三上悠亚国产精品一区二区三区| www.欧美精品| 国产成人手机在线| 在线欧美一区二区| 欧美性x x x| 91亚洲国产成人精品一区二区三| 天堂av在线网站| 韩国欧美一区| 午夜精品亚洲一区二区三区嫩草| 成人av影音| 国产经典一区二区| 免费看电影在线| 在线亚洲国产精品网| 黄色aaa毛片| 欧美视频在线不卡| 国产在线观看成人| 国产精品拍天天在线| 麻豆传媒一区| 日本一区视频在线观看| 国产99久久久久久免费看| 亚洲三级在线免费观看| 女同性恋一区二区三区| 美女免费视频一区| 成年人午夜免费视频| 成人羞羞视频在线看网址| 国产成人成网站在线播放青青| 亚洲一区二区三区四区| 色综合久综合久久综合久鬼88| 蜜桃免费在线| 欧美sm美女调教| 一区二区小视频| 亚洲mv大片欧洲mv大片精品| 黄色录像二级片| 日本一区二区视频在线| 麻豆精品国产传媒av| 精品午夜一区二区三区在线观看| 国产成人黄色片| 亚洲视频福利| 日韩 欧美 自拍| 成人免费av| 欧美一区二区三区成人久久片 | 国产老熟女伦老熟妇露脸| 精品在线免费视频| 另类小说色综合| 男女精品网站| 国产淫片免费看| 在线精品一区二区| 青青在线视频免费观看| 久久久久国产精品| 一区二区三区免费看| 北条麻妃国产九九九精品小说| 免费av一区二区三区| 国产精品香蕉| 精品国产福利| 天海翼亚洲一区二区三区| 国产欧美日韩伦理| 超碰一区二区三区| 国产精品果冻传媒潘| 亚洲精品在线播放| 国产激情美女久久久久久吹潮| 久久久91麻豆精品国产一区| 亚洲精品欧美一区二区三区| 国产精品久久久久久久久久辛辛 | 久久久久久久久久久免费精品| 麻豆av在线导航| 综合国产在线观看| 网友自拍视频在线| 久久精品国产久精国产思思| 老司机在线视频二区| 久久精品99久久久久久久久| 精品自拍一区| 欧美高清一级大片| 岛国在线视频网站| 欧美一区二区三区免费视| 亚洲啊v在线| 国产成人av网| 全球最大av网站久久| 国产伦精品免费视频| 99视频有精品高清视频| www日韩av| 精品伊人久久久| 欧美一区二区三区四区在线观看地址| 国产成人精品三级高清久久91| 日韩免费电影一区二区| 日韩一区欧美| 真人做人试看60分钟免费| 亚洲国产三级| 成人中文字幕av| 黄色小说综合网站| 黄色av电影网站| 久久只精品国产| www.黄色com| 亚洲风情在线资源站| 免费精品一区二区| 欧美一区二视频| 免费av网站观看| 一区二区三欧美| 女人天堂av在线播放| 欧美中文在线视频| 国产精久久久| 久久99精品久久久久久水蜜桃| 国产真实有声精品录音| 特色特色大片在线| 久久aⅴ乱码一区二区三区| 国产精品999| bbbbbbbbbbb在线视频| 欧美xxxx做受欧美.88| 交100部在线观看| 国产精品自产拍在线观| 成人精品毛片| 日韩电影大全在线观看| 在线国产一区二区| 激情六月丁香婷婷| 国产在线精品一区二区不卡了| jizz日本免费| 亚洲女人****多毛耸耸8| 亚洲精品男人的天堂| 91精品国产综合久久香蕉的特点 | 麻豆一区一区三区四区| 亚洲国产精品www| 亚洲高清不卡| 中文字幕在线视频精品| 久久久天堂av| 精品一区二区三区四| 欧美视频完全免费看| 亚洲aaaaaaa| 欧美劲爆第一页| 五月天色综合| 日韩hmxxxx| 一本久久综合| jjzzjjzz欧美69巨大| 国产精品久久久久久久岛一牛影视 | 亚洲free性xxxx护士hd| 精品久久久久久久久久久下田 | 精品少妇theporn| 欧美精品在线观看播放| 国产免费视频在线| 91精品国产高清| 国产福利资源一区| 在线播放 亚洲| 日韩影院精彩在线| 欧美大片免费播放器| 亚洲第一在线综合网站| 国内精品国产成人国产三级| 色哟哟入口国产精品| 中文字幕av一区二区三区佐山爱| 国产综合 伊人色| 影音先锋久久资源网| 国产在线观看免费播放| 亚洲色图视频网| 国产一区二区三区中文字幕| 色阁综合伊人av| 精品久久99| 亚洲精品在线免费看| 日本女人一区二区三区| 一区二区三区久久久久| 日本韩国一区二区| 韩国免费在线视频| 国产精品久久久久久久久久久久| 国产精品免费99久久久| 88av.com| 国产欧美日韩在线看| 国产精品欧美综合| 一区二区三区视频观看| 午夜av成人| 亚洲国产精品www| 韩国三级电影一区二区| 欧美丰满熟妇bbbbbb| 欧美一级一区二区| √天堂8在线网| 国产自产精品| 蜜桃av综合| 黄大色黄女片18免费| 丁香花在线电影小说观看| 成人激情视频网| 亚洲深深色噜噜狠狠爱网站| 亚洲精品乱码久久久久久9色| 夜夜亚洲天天久久| 欧美少妇bbw| 秋霞成人午夜鲁丝一区二区三区| 久久99青青| 亚洲国产日韩欧美在线观看| 亚洲日本在线观看| 狠狠综合久久av一区二区| 7m精品福利视频导航| 日本一区二区免费高清| 亚洲天堂伊人网| 亚洲午夜一区二区| 男男激情在线| 成人久久一区二区| 一区在线免费| 国产精品密蕾丝袜| 欧美日韩国产影片| 黄色影院在线看| 欧美影视一区二区| 国产伦精品一区二区三区免费| 国产网址在线观看| 一本色道久久综合亚洲精品小说 | 亚洲激情视频网| 欧美123区| 黄瓜视频免费观看在线观看www | 久久伊人资源站| 蜜桃av一区二区三区电影| 青青操视频在线播放| 亚洲女人被黑人巨大进入al| 综合久草视频| 成年人网站免费视频| 中文字幕中文字幕一区| 亚洲av成人无码网天堂| 国产精品久久久久久久久久久久久久| 女人天堂亚洲aⅴ在线观看| 国产传媒第一页| 91精品国产福利| 日韩深夜视频| 国产精品一二三在线观看| 久久久av毛片精品| 亚洲不卡免费视频| 国产精品欧美日韩| 精品二区久久| 亚洲AV成人无码精电影在线|