我们先来看看文档:
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就心寒,毕竟等了那么长时间,具体怎么实现,见下回分解