问题描述
本人在看这个例子,发现一个问题,也就是在写入文件存在问题,导致它读出的时候不是按我们设想的那样,大家看看问题存在哪,现附上源代码: 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);}}}
解决方案
引用 public static void writeFixedString(String s,int size,DataOutput out)out.writeChar(ch);out.write(ch); 不对