/**
* 将emp.dat文件中所有员工解析出来,并创建为若干Emp实例存入一个
* 集合,然后输出该集合中每个员工信息。
* 该文件800字节,每80个字节为一个员工的信息。
* 其中:
* name为字符串,长度为32个字节,编码为:UTF-8
* age为int,长度为4个字节
* gender为字符串,长度为10个字节,编码为:UTF-8
* salary为int,长度为4个字节
* hiredate为字符串,格式"yyyy-MM-dd",长度为30个字节,编码为:UTF-8
* 格式可参考当前包中emp.jpg图
* 提示:
* 使用RandomAccessFile读取字符串时,例如name,可以先读取32个字节,再按照UTF-8
* 转换为字符串,读取age时可以直接使用readInt方法。依次类推。
* @author Xiloer
*
*/
代码如下:
public class Demo3 {
public static void main(String[] args) throws URISyntaxException, IOException, ParseException {
File file = new File(Demo3.class.getClassLoader().getResource("homework01/emp.dat").toURI());//加载文件
RandomAccessFile raf = new RandomAccessFile(file,"r");
List list = new ArrayList();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//解析成集合
for(int i=0;i<10;i++){
//读取姓名
String name = readString(raf,32);
//读取年龄
int age = raf.readInt();
//读取性别
String gender =readString(raf,10);
//读取工资
int salary = raf.readInt();
//读取日期
Date hiredate = sdf.parse(readString(raf,30));
Emp emp = new Emp(name,age,gender,salary,hiredate);
list.add(emp);
}
System.out.println("解析完毕");
for(Emp emp : list){
System.out.println(emp.toString());
}
}
//用于读取一定字节量的数据--按照UTF-8转换为字符串
public static String readString(RandomAccessFile raf,int len) throws IOException{
byte[] arr = new byte[len];
raf.read(arr);
return new String(arr,"UTF-8").trim();
}
}
测试结果如下:
王大锤,25,男,8000,2011-04-23
赵四,27,女,12000,2010-12-17
jackson,29,男,16000,2008-02-29
rose,32,女,18000,2006-01-02
佟湘玉,24,女,11000,2009-03-06
白展堂,33,男,17000,2010-09-01
marry,40,女,36000,1998-10-04
李大嘴,30,男,14000,2002-11-30
抛出异常情况:
/**
* 使用异常捕获机制完成下述读取操作,并在finally中有关闭RandomAccessFile操作。
* 将emp.dat文件中所有员工解析出来,并创建为若干Emp实例存入一个
* 集合,然后按照员工入职从晚到早的顺序依次输出员工信息。
*
* 该文件560字节,每56个字节为一个员工的信息。
* 其中:
* name为字符串,长度为32个字节,编码为:UTF-8
* age为short,长度为2个字节
* gender为字符串,长度为10个字节,编码为:UTF-8
* salary为int,长度为4个字节
* hiredate为long,长度为8个字节
* 格式可参考当前包中emp.jpg图
* @author Xiloer
*
*/
代码如下:
public class Test05 {
public static void main(String[] args) {
File file = new File("src"+File.separator+"homework03"+File.separator+"emp.dat");
List list = getList(file);
Collections.sort(list,new Comparator(){//自定义比较规则
@Override
public int compare(Emp o1, Emp o2) {
long time = o2.getHiredate().getTime() - o1.getHiredate().getTime();
return time >0? 1:-1;
}
});
for(Emp emp : list){
System.out.println(emp.toString());
}
}
//传入数组长度,返回字符串
public static String getString(int n,RandomAccessFile raf) throws IOException{
byte[] sub = new byte[n];
raf.read(sub);
return new String(sub,"UTF-8");
}
//将文件解析成集合的形式返回
public static List getList(File file){
RandomAccessFile raf = null;
List list = new ArrayList();
try{
raf = new RandomAccessFile(file,"r");
for(int i=0;i<10;i++){
String name = getString(32,raf).trim();
int age = raf.readShort();//2个字节
String gender = getString(10,raf).trim();
int salary = raf.readInt();//4
Date hiredate = new Date(raf.readLong());
Emp emp = new Emp(name,age,gender,salary,hiredate);
list.add(emp);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(raf != null){
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return list;
}
}
测试结果如下:
张小花,26,男,7000,2014-08-03
lisa,23,女,6000,2012-07-15
王大锤,25,男,8000,2011-04-23
赵四,27,男,12000,2010-12-17
白展堂,33,男,17000,2010-09-01
佟湘玉,24,女,11000,2009-03-06
jackson,29,男,16000,2008-02-29
rose,32,女,18000,2006-01-02
李大嘴,30,男,14000,2002-11-30
marry,40,女,36000,1998-10-04