本人在看这个例子,发现一个问题,也就是在写入文件存在问题,导致它读出的时候不是按我们设想的那样,大家看看问题存在哪,现附上源代码:
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);
}
}

}