RandomAccessFile是一个很有用的类,可以将字节流写入到磁盘文件中,对应的也可以从磁盘文件中读取出字节流,它可以用于多线程下载,参考:http://blog.csdn.net/yourijing/article/details/47667709
在API中关于RandomAccessFile的描述如下:此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer
方法读取,并通过 seek
方法设置。通常,如果此类中的所有读取例程在读取所需数量的字节之前已到达文件末尾,则出 EOFException
(是一种 IOException
)。如果由于某些原因无法读取任何字节,而不是在读取所需数量的字节之前已到达文件末尾,则抛出 IOException
,而不是 EOFException
。需要特别指出的是,如果流已被关闭,则可能抛出 IOException
。
1、 seek(long pos)方法 native方法
设置文件指针的偏移量
2、getFilePointer()方法 native方法
返回此文件中的当前偏移量。
3、文件模式
“r” 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
“rw” 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
“rws” 打开以便读取和写入,对于 “rw”,还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
“rwd” 打开以便读取和写入,对于 “rw”,还要求对文件内容的每个更新都同步写入到底层存储设备
代码事例:
public class CharsetTest {public static void main(String[] args) throws IOException {
Person person = new Person(10, "zhangsan", 12.3);
RandomAccessFile raf = new RandomAccessFile("D://java.txt", "rw");
person.WriteFile(raf);
System.out.println("OK");
raf.seek(0);
person.ReadFile(raf);
}
}
class Person
{
private int id;
private String nameString;
private double height;
public Person()
{
}
public Person(int id,String name,double hei)
{
this.id = id;
this.nameString = name;
this.height = hei;
}
public void WriteFile(RandomAccessFile raf) throws IOException
{
//写如文件
raf.writeInt(id);raf.writeUTF(nameString);
raf.writeDouble(height);
}
public void ReadFile(RandomAccessFile raf) throws IOException
{
//读出文件,若没有按照写入的顺序读,则报异常 或结果异常
int temp = raf.readInt();
String string = raf.readUTF();
double db = raf.readDouble();
System.out.println(temp+" " + string +" "+ db);
}
}