用RandomAccessFile往文件中写入三名员工信息,并按照第二名、第一名 、第三名顺序读出员工信息...

此种情况下员工的姓名值可以是英文 且年龄只允许占用一个字节

import java.io.RandomAccessFile;

public class RandomFileTest {

/*
*RandomAccessFile类提供了众多的文件访问方法 支持“随即访问”方法
*并且对读写等长记录格式的文件时有很大的优势
*但是此类仅限于操作文件,不能访问其他的io设备,如网络,内存映像等
*构造函数 new RandomAccessFile(f,“rw”)读写方式
*构造函数 new RandomAccessFile(f,“r”)只读方式
*本程序目的是往文件中写入三名员工信息,每位员工还有姓名和年龄字段,、
*然后按照第二名、第一名 、第三名顺序读出员工信息
*/
public static void main(String[] args) throws Exception {
Employee e = new Employee("zhangsan",18);//第一名员工信息
Employee e1 = new Employee("lisi",28);//第二名
Employee e2 = new Employee("wangwu",23);//第三名

RandomAccessFile raf = new RandomAccessFile("employee.txt","rw");
//把员工的信息以读写的方式存入到某个文件当中

raf.write(e.name.getBytes());
//以字节的形式保存到文件当中
raf.write(e.age);
//使用这个方法的时候 当年龄值的范围大于一个字节的话 读取其中的一个字节 剩余的被丢弃
//raf.writeInt(e.age);
//使用这个方法的时候 把里面的四个字节全部读出来

raf.write(e1.name.getBytes());
raf.write(e1.age);
//raf.writeInt(e1.age);

raf.write(e2.name.getBytes());
raf.write(e2.age);
//raf.writeInt(e2.age);
raf.close();


byte buf[] = new byte[8];
int len = 0;
String strName = null;
RandomAccessFile ra = new RandomAccessFile("employee.txt","r");
//从文件中读出第二个员工的信息 需要跳过9个字节 因为每个员工的信息占9字节
ra.skipBytes(9);
//跳过9个字节 员工姓名占8个字节 年龄占1个字节
//如果上面用raf.writeInt(e.age);的方法存储年龄的话 此处应为ra.skipBytes(12); 因为员工姓名占8个字节 年龄占4个字节 需跳转12字节
len = ra.read(buf);
strName = new String(buf,0,len);
//字节数组转换成字符串 从而取出员工的姓名
System.out.println(strName.trim()+ ":"+ra.read());
//去掉字符串中不可见的字符 即空格

//下面读取第一个员工的信息
ra.seek(0);//绝对定位 让指示器跳到文件的开始处
len = ra.read(buf);
strName = new String(buf,0,len);
System.out.println(strName.trim()+ ":"+ra.read());

//以下读取到第三个员工的信息
ra.skipBytes(9);
//由于读取完第一个员工的信息后 指示器指在第二个员工信息处 需跳转9个字节开始取第三个员工信息
len = ra.read(buf);
strName = new String(buf,0,len);
System.out.println(strName.trim()+ ":"+ra.read());

ra.close();

}

}

public class Employee {
//Employee 类定义员工的基本信息 并对员工的姓名做简单的判断
public String name = null;
public int age = 0;
public static final int LEN = 8;
// LEN 规定员工的姓名为8个字符
public Employee(String name,int age) {
if(name.length()>LEN){
name = name.substring(0,7);
//员工的姓名多余8个字符的时候 把后边的给去掉
}else{
while(name.length()<LEN){
name +="\u0000";
}
//如果不够8个的话 就用空补足8个字符
}
this.name = name ;
//如果是八个字符的话 直接赋值
this.age = age;
}

}



经过改进后 员工的姓名可以是中文或者英文 并且年龄的范围值也可以大于一个字节的范围 并且进一步的优化了代码

import java.io.RandomAccessFile;

public class RandomFileTest {

/*
*RandomAccessFile类提供了众多的文件访问方法 支持“随即访问”方法
*并且对读写等长记录格式的文件时有很大的优势
*但是此类仅限于操作文件,不能访问其他的io设备,如网络,内存映像等
*构造函数 new RandomAccessFile(f,“rw”)读写方式
*构造函数 new RandomAccessFile(f,“r”)只读方式
*本程序目的是往文件中写入三名员工信息,每位员工还有姓名和年龄字段,、
*然后按照第二名、第一名 、第三名顺序读出员工信息
*
*/
public static void main(String[] args) throws Exception {
Employee e = new Employee("first",18);//第一名员工信息
Employee e1 = new Employee("第二名",28);//第二名
Employee e2 = new Employee("第三名",24);//第三名

RandomAccessFile raf = new RandomAccessFile("employee.txt","rw");
//把员工的信息以读写的方式存入到某个文件当中

//raf.write(e.name.getBytes());
//以字节的形式保存到文件当中
//用字节的方式写入的时候 当员工的姓名是汉字的时候会出现错误 因为在java 中不管是中文字符还是英文字符 它们都是一个字符 都占用两个字节 在本地的计算机编码系统中英文字符占用一个字节 而中文字符占用两个字节
raf.writeChars(e.name);
//此时我们用writeChars写入8个字符 每个字符采用的都是unicode编码每个字符占用两个字节
//raf.write(e.age);
//使用这个方法的时候 当年龄值超过了一个字节的范围的话 只写入一个字节内容 剩余的被丢弃
raf.writeInt(e.age);
//使用这个方法的时候 把里面的四个字节数据全部写入文件中

//raf.write(e1.name.getBytes());
raf.writeChars(e1.name);

//raf.write(e1.age);
raf.writeInt(e1.age);


//raf.write(e2.name.getBytes());
raf.writeChars(e2.name);

//raf.write(e2.age);
raf.writeInt(e2.age);
raf.close();


//byte buf[] = new byte[8];
//byte []buf = new byte[Employee.LEN];
//int len = 0;
String strName = "";
//空对象
RandomAccessFile ra = new RandomAccessFile("employee.txt","r");
//从文件中读出第二个员工的信息 需要跳过9个字节 因为每个员工的信息占9字节
//ra.skipBytes(9);
ra.skipBytes(Employee.LEN*2+4);//所以在此应该跳过的是 8*2+4个字节

//跳过9个字节 员工姓名占8个字节 年龄占1个字节
//如果上面用raf.writeInt(e.age);的方法存储年龄的话 此处应为ra.skipBytes(12); 因为员工姓名占8个字节 年龄占4个字节 需跳转12字节
//len = ra.read(buf);
//strName = new String(buf,0,len);
for(int i =0;i<Employee.LEN;i++){
strName += ra.readChar();
}
//字节数组转换成字符串 从而取出员工的姓名
//System.out.println(strName.trim() + ":"+ra.read());
System.out.println(strName.trim() + ":"+ra.readInt());
//去掉字符串中不可见的字符 即空格

//下面读取第一个员工的信息
ra.seek(0);//绝对定位 让指示器跳到文件的开始处
//len = ra.read(buf);
//strName = new String(buf,0,len);
strName = "";
//读取完之后进行下一次的读取的时候 清空 从而不让strName 相加
for(int i =0;i<Employee.LEN;i++){
strName += ra.readChar();
}
System.out.println(strName.trim() + ":"+ra.readInt());

//以下读取到第三个员工的信息
//ra.skipBytes(9);
ra.skipBytes(Employee.LEN*2+4);
//由于读取完第一个员工的信息后 指示器指在第二个员工信息处 需跳转9个字节开始取第三个员工信息
//len = ra.read(buf);
//strName = new String(buf,0,len);
strName = "";
for(int i =0;i<Employee.LEN;i++){
strName += ra.readChar();
}
System.out.println(strName.trim() + ":"+ra.readInt());

ra.close();

}

}

public class Employee {
//Employee 类定义员工的基本信息 并对员工的姓名做简单的判断
public String name = null;
public int age = 0;
public static final int LEN = 8;
// LEN 常量 规定员工的姓名为8个字符
public Employee(String name,int age) {
if(name.length()>LEN){
name = name.substring(0,7);
//员工的姓名多余8个字符的时候 把后边的给去掉
}else{
while(name.length()<LEN){
name +="\u0000";
}
//如果不够8个字符的话 就用空补足8个字符
}
this.name = name ;
//如果是八个字符的话 直接赋值
this.age = age;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值