我們先來看看文檔:
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就心寒,畢竟等了那麼長時間,具體怎麼實現,見下回分解