日期:2014-05-20  浏览次数:20972 次

关于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);
        }
    }
    
}






------解决方案--------------------