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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于#flink#的问题:关于docker部署flink集成hadoop的yarn,请教个问题flink启动yarn-session.sh连不上hadoop
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题