RandomAccessFile类的使用

来源:互联网 发布:网络的利与弊征文字少 编辑:程序博客网 时间:2024/05/16 13:15

---------------------- android培训、java培训、期待与您交流! ----------------------

RandomAccessFile主要作用是在读取或写入文件时能够使用seek()方法定位指示器,方便从指示器的位置开始进行读写操作。RandomAccessFile类只限于操作文件,不可用于其它IO设备,如网络、内存映象等。网络文件下载中会用到RandomAccessFile,当要继续上一次被中断的下载或者使用多线程分工下载时,RandomAccessFile就有用武之地了。

例子:

往文件中写入三个员工的基本信息,第个员工包含两个字段:姓名与年龄,然后从文件中先把第2名员工读出来,然后读第1 名、第3名。

编写这个小程序的思路是这样的:姓名指定为8个字节,年龄为int 类型,为4个字节。

在编写这个小程序时,遇到的问题比较多。

首先是write(int b)方法与writeInt(int v) 方法的使用。write(int b)方法是写入b中的一个字节,当b>255时,b将大于1个字节,此方法只能写入一个字节,此时写入的值将会出现错误;而writeInt(int v) 方法一次写入4个字节,即一个整型的数的大小,在JAVA 中,一个int类型的数据就是4个字节,一次性把一个整型的数据写入了文件,这样便解决了使用write(int b)方法时出现的问题了。

其次是把姓名写进文件中,然后读出来的过程。刚开始时使用write(byte [ ] buf)方法,把8个字节大的姓名字符串转换为字节装到buf中,然后再把buf写到文件中。当姓名为英文时,这样子做是可以的,但当姓名是中文的时候,读取时就会出现乱码,原因是,在windows中,一个中文占两个字节,而一个英文占的是一个字节;而在JAVA中,不管是英文还是中文,每一个字都用两个字节表示。后来改为用writeChars(String s)方法,一个字符一个字符地写进去,使用readChar()方法循环地把字符一个一个地取出来。

最后是常量的使用。在指定姓名为8个字节时,将其大小定为常量,为将来的修改带来方便。当姓名的长度不够8个字节时,在姓名后面连续加上"\u0000"即“空格”符号补足到8个字节,当姓名的长度大于8个字节时,使用字符串的substring(int beginIndex, int endIndex)方法将其截掉,即name.substring(0, 8)。

将以上问题都修正后,得到如下小程序:

RandomAccessFileTest。

import java.io.*;
public class RandomAccessFileTest{
public static void main(String [] args) throws Exception {
Employee e1 = new Employee("张三",22);
Employee e2 = new Employee("lisi",23);
Employee e3 = new Employee("wangwu",24);


RandomAccessFile r = new RandomAccessFile("aa.txt","rw");
r.writeChars(e1.getName());
r.writeInt(e1.getAge());
r.writeChars(e2.getName());
r.writeInt(e2.getAge());
r.writeChars(e3.getName());
r.writeInt(e3.getAge());
r.close();


String name = "";
int length = 0;
RandomAccessFile r1 = new RandomAccessFile("aa.txt","r");
byte[] buf = new byte[Employee.LENGTH];


r1.skipBytes(Employee.LENGTH * 2+ 4);
//length = r1.read(buf);
//name = new String(buf,0,length);
for(int i = 0; i < Employee.LENGTH; i ++) {
name += r1.readChar();
}
System.out.println(name + ":" + r1.readInt());


r1.seek(0);
//length = r1.read(buf);
//name = new String(buf,0,length);
name = "";
for(int i = 0; i < Employee.LENGTH; i ++) {
name += r1.readChar();
}
System.out.println(name + ":" + r1.readInt());


r1.skipBytes(Employee.LENGTH * 2+ 4);
//length = r1.read(buf);
//name = new String(buf,0,length);
name = "";
for(int i = 0; i < Employee.LENGTH; i ++) {
name += r1.readChar();
}
System.out.println(name + ":" + r1.readInt());


r.close();
}
}


class Employee{
private String name;
private int age;
public static final int LENGTH = 8;
public Employee(String name, int age) {
if(name.length() > LENGTH) {
name = name.substring(0,LENGTH);
} else {
while(name.length() < LENGTH) {
name += "\u0000"; 
}
}
this.name = name;
this.age = age;
}


public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}


public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}



---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima

原创粉丝点击