按照字节数读取文件

/**
 * 将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





你可能感兴趣的:(java基础,文件操作(有异常处理))