本人在看这个例子,发现一个问题,也就是在写入文件存在问题,导致它读出的时候不是按我们设想的那样,大家看看问题存在哪,现附上源代码:
- Java code
import java.io.*;import java.util.*;public class RandomFileTest { public static void main(String[] args) throws IOException { Empolyee[] staff = new Empolyee[3]; staff[0] = new Empolyee("Carl Cracker",75000,1987,12,15); staff[1] = new Empolyee("Harry Hacker",50000,1989,10,1); staff[2] = new Empolyee("Tony Tester", 40000, 1990, 3, 15); DataOutputStream out = new DataOutputStream(new FileOutputStream("employee.dat")); for(Empolyee e : staff) e.writeData(out); out.close(); RandomAccessFile in = new RandomAccessFile("employee.dat", "r"); int n = (int)(in.length()/Empolyee.RECORD_SIZE); Empolyee[] newStaff = new Empolyee[n]; for(int i= n-1;i>=0;i--) { newStaff[i] = new Empolyee(); in.seek(i*Empolyee.RECORD_SIZE); newStaff[i].readData(in); } in.close(); for(Empolyee e :newStaff) { System.out.println(e); } } }class Empolyee{ public Empolyee(){} public Empolyee(String n,double s,int year,int month,int day) { name = n; salary = s; GregorianCalendar calendar = new GregorianCalendar(year,month-1,day); hireDay = calendar.getTime(); } public String getName() { return name; } public double getSalary() { return salary; } public Date getHireDay() { return hireDay; } public void raiseSalary(double byPercent) { double raise = salary*byPercent/100; salary+=raise; } public String toString() { return getClass().getName()+"[name="+name+",salary="+salary+",hireDay="+hireDay+"]"; } public void writeData(DataOutput out) throws IOException { DataIO.writeFixedString(name, NAME_SIZE, out); out.writeDouble(salary); GregorianCalendar calendar = new GregorianCalendar(); calendar.setTime(hireDay); out.writeInt(calendar.get(Calendar.YEAR)); out.writeInt(calendar.get(Calendar.MONTH)+1); out.writeInt(calendar.get(Calendar.DAY_OF_MONTH)); } public void readData(DataInput in) throws IOException { name = DataIO.readFixedString(NAME_SIZE, in); salary = in.readDouble(); int y = in.readInt(); int m = in.readInt(); int d = in.readInt(); GregorianCalendar calendar = new GregorianCalendar(y,m-1,d); hireDay = calendar.getTime(); } private String name; private double salary; private Date hireDay; public static final int NAME_SIZE = 40; public static final int RECORD_SIZE = 2*NAME_SIZE+8+4+4+4;}class DataIO{ public static String readFixedString(int size,DataInput in) throws IOException { StringBuilder b = new StringBuilder(size); int i=0; boolean more = true; while(more&&i<size) { char ch = in.readChar(); i++; if(ch==0) { more = false; }else{ b.append(ch); } } in.skipBytes(2*(size-i)); return b.toString(); } public static void writeFixedString(String s,int size,DataOutput out) throws IOException { for(int i=0;i<size;i++) { char ch = 0; if(i<s.length()) ch = s.charAt(i); out.write(ch); } } }
------解决方案--------------------