当前位置: 代码迷 >> J2SE >> 关于JAVA核心技术卷II中一个例子的有关问题,大家一起看下
  详细解决方案

关于JAVA核心技术卷II中一个例子的有关问题,大家一起看下

热度:19   发布时间:2016-04-24 00:58:15.0
关于JAVA核心技术卷II中一个例子的问题,大家一起看下
本人在看这个例子,发现一个问题,也就是在写入文件存在问题,导致它读出的时候不是按我们设想的那样,大家看看问题存在哪,现附上源代码:
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);        }    }    }


------解决方案--------------------
  相关解决方案