package cn.itcast.domian;
import java.io.Serializable;
public class Employee implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
private int age;
public static final int LEN = 8;
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;
}
public Employee(String name, int age) {
if(name.length() > LEN)
{
name = name.substring(0, LEN);
}else
{
while(name.length() < LEN)
{
//"\0000"是unicode编码的一个空的意思
name += "\u0000";
}
}
this.name = name;
this.age = age;
}
}
//这是RandomAccessFile的测试
package cn.itcast.test;
import java.io.RandomAccessFile;
import cn.itcast.domian.Employee;
public class AccessTest {
//这样写入到基本是的数据,年龄显示出来的是乱码,因为记事本不支持unicode编码
public static void main(String[] args) throws Exception {
Employee employee1 = new Employee("张三", 258);
Employee employee2 = new Employee("lixiaolu", 25);
Employee employee3 = new Employee("maozedong", 45);
RandomAccessFile randomAccessFile = new RandomAccessFile("accessTest.txt", "rw");
//用write直接写入英文没问题,但是一旦写入中文就会出现问题,这是因为在java中一个中文也是一个字节,但是我们读取的时候,我们
//的操作系统认为一个中文是两个字节,那时候就会出现错误,正确的处理方法是用writeChars()来写入中文
//还有当我们当我们用write写入整数的时候,只占用了一个字节,但是如果我们的整数的范围大于字节的最大值的时候,就会出现截取高位的问题
//所以我们用writeInt方法来写入整数
// randomAccessFile.write(employee1.getName().getBytes());
randomAccessFile.writeChars(employee1.getName());
// randomAccessFile.write(employee1.getAge());
randomAccessFile.writeInt(employee1.getAge());
// randomAccessFile.write(employee2.getName().getBytes());
randomAccessFile.writeChars(employee2.getName());
randomAccessFile.writeInt(employee2.getAge());
// randomAccessFile.write(employee3.getName().getBytes());
randomAccessFile.writeChars(employee3.getName());
randomAccessFile.writeInt(employee3.getAge());
//千万要记得需要关闭这个文件,因为这个文件类的实现本身带有一些输入输出流
randomAccessFile.close();
//这是文件里的内容
RandomAccessFile randomAccessFile2 = new RandomAccessFile("accessTest.txt", "rw");
randomAccessFile2.skipBytes(20);
String strName = "";
for(int i = 0; i < 8; i++)
{
strName += randomAccessFile2.readChar();
}
//randomAccessFile2.read()是将记事本中的一个字节读取出来,randomAccessFile2.readInt()是将记事本中读取四个字节
//randomAccessFile2.read(buffer)这是从记事本中读取buffer字节长度的字节数
System.out.println(strName.trim() + "-->" + randomAccessFile2.readInt());
strName = "";
randomAccessFile2.seek(0);
for(int i = 0; i < 8; i++)
{
strName += randomAccessFile2.readChar();
}
System.out.println(strName.trim() + "-->" + randomAccessFile2.readInt());
strName = "";
randomAccessFile2.seek(40);
for(int i = 0; i < 8; i++)
{
strName += randomAccessFile2.readChar();
}
System.out.println(strName.trim() + "-->" + randomAccessFile2.readInt());
randomAccessFile2.close();
}
}
//File 和 RandomAccessFile的区别
只看名字就知道RandomAccessFile实现随机访问文件的功能,文档定义:随机存取文件的行为类似存储在文件系统中的一个大型字节数组。存在指向该隐含数组的光标或索引,称为文件指针;输进操纵从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。假如随机存取文件以读取/写进模式创建,则输出操纵也可用;输出操纵从文件指针开始写进字节,并随着对字节的写进而前移此文件指针。写进隐含数组确当前末尾之后的输出操纵导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。
RandomAccessFile同时将FileInputStream和FileOutputStream整合到一起,而且支持将从文件任意字节处读或写数据,RandomAccessFile类提供一种机制,相当于在文件流中插进了一个指针,可以按需读取。
File只是对一个文件或目录的抽象,可以想象成是一个文件句柄、标识,这个类本身只提供对文件的打开,封闭,删除,属性访问等等;