對RandomAccessFile的理解

我們先來看看文檔:
RandomAccessFile此類的實例支持對隨機訪問文件的讀取和寫入。隨機訪問文件的行爲類似存儲在文件系統中的一個大型 byte 數組。存在指向該隱含數組的光標或索引,稱爲文件指針;輸入操作從文件指針開始讀取字節,並隨着對字節的讀取而前移此文件指針。如果隨機訪問文件以讀取/寫入模式創建,則輸出操作也可用;輸出操作從文件指針開始寫入字節,並隨着對字節的寫入而前移此文件指針。寫入隱含數組的當前末尾之後的輸出操作導致該數組擴展。該文件指針可以通過 getFilePointer 方法讀取,並通過 seek 方法設置。
那麼通過對上面的理解,我們大致能夠猜出這個類是對文件進行操作,同事,同事具有對對文件的隨機訪問能力,同時我們發現,這個類對文件操作是使用了文件指針的方式進行訪問的。在讀取數據時,我們通過文件指針的前移來讀取,在進行寫的時候,文件總文件指針開始寫入。可能還是比較抽象,現在我們來測試一下
首先我們點擊工程–>新建文件夾—>新建文件new.txt–>輸入部分東西做測試
這裏寫圖片描述

接着我們看demo

package com.fangzhiyue.demo;

import java.awt.Window.Type;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;

public class Demo {

      String data=",手裏拿着小皮鞭,抽他的pp";
    RandomAccessFile randomAccessFile;
    File file;
     ByteArrayInputStream byteArrayInputStream;
    public static void main(String[] args) {
    new Demo();
    }

    public Demo() {
        file=new File("world//new.txt");
           long length=file.length();
        byteArrayInputStream=new ByteArrayInputStream(data.getBytes());
    try {
        randomAccessFile=new RandomAccessFile(file, "rw");
        randomAccessFile.seek(length);
        //將文件指針移動到文件尾
        byte[] b=new byte[1024];
        int len;
       while(((len=byteArrayInputStream.read(b)))!=-1){
           randomAccessFile.write(b);
       }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }
}

然後我們看下結果
這裏寫圖片描述

結果果然如此,繼續探討,查找文檔,我發現了這個
這裏寫圖片描述
還記得在剛學java的時候,就看到了這個api,不過部分的io流並不支持skip();,mark();,reset();方法,玩了,程序寫多了,直接加號了,我們玩玩這個方法。我們將new.txt文件修改減少一部分
這裏寫圖片描述
在java中中文佔兩個字節,用char類型表示,因爲是Unicode編碼,
ps: utf-8 的漢字佔3個字節 gbk 是兩個
我們修改demo如下

package com.fangzhiyue.demo;

import java.awt.Window.Type;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;

public class Demo {

      String data=",手裏拿着小皮鞭,抽他的pp";
    RandomAccessFile randomAccessFile;
    File file;
     ByteArrayInputStream byteArrayInputStream;
    public static void main(String[] args) {
    new Demo();
    }

    public Demo() {
        file=new File("world//new.txt");
           long length=file.length();
        byteArrayInputStream=new ByteArrayInputStream(data.getBytes());
    try {
        randomAccessFile=new RandomAccessFile(file, "rw");
        //randomAccessFile.seek(length);
        byte[] b=new byte[1024];
        int len;
        randomAccessFile.skipBytes(14);
       while(((len=byteArrayInputStream.read(b)))!=-1){
           randomAccessFile.write(b,0,len);
       }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }
}

我們僅僅修改了兩行代碼,註釋了seek()方法,運用skipBytes(14)跳過了14個字節,程序運行如下
這裏寫圖片描述

可以,也是實現了,那麼我們會好奇,這個東西有什麼用呢?大家想想我們在什麼時候用的到?。。。。。
就不賣關子了,我們在下載的時候就能用得到,當我們在下載lol或者cf啊什麼的時候,tmd突然斷網了,你內心是崩潰的,如果沒有這種緩存技術,那麼恐怕你每次下載東西下一半斷網,就得從新下載,想想你們99%的lol就心寒,畢竟等了那麼長時間,具體怎麼實現,見下回分解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章