dreamhyz
2012-05-22 10:12
浏览 161
已采纳

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

本人在看这个例子,发现一个问题,也就是在写入文件存在问题,导致它读出的时候不是按我们设想的那样,大家看看问题存在哪,现附上源代码:
[code="java"]

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

}

[/code]

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • _1_1_7_ 2012-05-22 11:33
    已采纳

    [quote] public static void writeFixedString(String s,int size,DataOutput out)[/quote]

    [code="java"]out.writeChar(ch);[/code]

    out.write(ch); 不对

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题