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

问题描述

本人在看这个例子,发现一个问题,也就是在写入文件存在问题,导致它读出的时候不是按我们设想的那样,大家看看问题存在哪,现附上源代码: 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); 不对

时间: 2024-09-11 11:01:28

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

java 中一个简单的正则表达式问题,帮忙看下.

问题描述 哪位朋友帮忙看一下.这个正则表达式:String regex = "mailto:\w+\?";匹配下面这段内容为什么匹配不到..mailto:34553234@qq.com?cc=zhoueyese7290783@126.com&subject=applicationID:10001-action:approver&body=特别无聊. String regex = "mailto:\w+\?"; Pattern pattern = Pa

java多线程问题,java 编程思想书中的例子

问题描述 java多线程问题,java 编程思想书中的例子 在看java编程思想书中的多线程一节,书中对wait,notify,notifyall举了一个例子,模拟给汽车涂蜡和抛光的过程, 因为抛光任务在涂蜡之前是不能尽兴的,反之,涂蜡任务在涂另外一层蜡之前,必须要等抛光任务结束.代码如下: 显示一个汽车类: class Car{ private boolean wanOn=false; public synchronized void waxed(){ waxOn=true; notifyAl

页面-java web网上书店有个问题 求大神帮忙看下

问题描述 java web网上书店有个问题 求大神帮忙看下 前一个页面一个表单传值, 请输入收货地址: 后面在OrderServlet中处理 其中的数据库中的操作没有问题 但是连到OrderServlet中出现求大神帮忙!!!!! 解决方案 你点击继续看看什么效果啊,如果有问题就贴出来 解决方案二: 没有效果就是停在这个servlet了,而且数据库方法也没有实现 解决方案三: 数据库方法也没有实现

Java核心技术卷I基础知识3.1 一个简单的Java应用程序

第3章 Java的基本程序设计结构 ▲  一个简单的Java应用程序     ▲  字符串 ▲  注释                      ▲  输入输出 ▲  数据类型               ▲  控制流 ▲  变量                      ▲  大数值 ▲  运算符                  ▲  数组   现在,假定已经成功地安装了JDK,并且能够运行第2章中给出的示例程序.我们从现在开始将介绍Java应用程序设计.本章主要介绍程序设计的基本概念(如数

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一1.9 收集到映射表中

1.9 收集到映射表中 假设我们有一个Stream,并且想要将其元素收集到一个映射表中,这样后续就可以通过它们的ID来查找人员了.Collectors.toMap方法有两个函数引元,它们用来产生映射表的键和值.例如, 如果有多个元素具有相同的键,那么就会存在冲突,收集器将会抛出一个Illegal-StateException对象.可以通过提供第3个函数引元来覆盖这种行为,该函数会针对给定的已有值和新值来解决冲突并确定键对应的值.这个函数应该返回已有值.新值或它们的组合. 在下面的代码中,我们构建

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一导读

前 言 致读者 本书是按照Java SE 8完全更新后的<Java核心技术 卷Ⅱ 高级特性(原书第10版)>.卷Ⅰ主要介绍了Java语言的一些关键特性:而本卷主要介绍编程人员进行专业软件开发时需要了解的高级主题.因此,与本书卷Ⅰ和之前的版本一样,我们仍将本书定位于用Java技术进行实际项目开发的编程人员. 编写任何一本书籍都难免会有一些错误或不准确的地方.我们非常乐意听到读者的意见.当然,我们更希望对本书问题的报告只听到一次.为此,我们创建了一个FAQ.bug修正以及应急方案的网站http:/

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.8 XSL转换

3.8 XSL转换 XSL转换(XSLT)机制可以指定将XML文档转换为其他格式的规则,例如,转换为纯文本.XHTML或任何其他的XML格式.XSLT通常用来将某种机器可读的XML格式转译为另一种机器可读的XML格式,或者将XML转译为适于人类阅读的表示格式. 你需要提供XSLT样式表,它描述了XML文档向某种其他格式转换的规则.XSLT处理器将读入XML文档和这个样式表,并产生所要的输出(参见图3-7). XSLT规范很复杂,已经有很多书描述了该主题.我们不可能讨论XSLT的全部特性,所以我们

Java核心技术卷I基础知识2.5 构建并运行applet

2.5 构建并运行applet 本书给出的前两个程序是Java应用程序.它们与所有本地程序一样,是独立的程序.然而,正如第1章提到的,有关Java的大量宣传都在炫耀Java在浏览器中运行applet的能力.如果你对"过去的记忆"感兴趣,可以继续阅读下面的内容来了解如何构建和运行一个applet,以及如何在Web浏览器中显示:如果你不感兴趣,完全可以跳过这个例子,直接转到第3章. 首先,打开终端窗口并转到CoreJava/v1ch02/RoadApplet,然后,输入下面的命令:   图

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.3.1 文档类型定义

3.3.1 文档类型定义 提供DTD的方式有多种.可以像下面这样将其纳入到XML文档中: 正如你看到的,这些规则被纳入到DOCTYPE声明中,位于由[...]限定界限的块中.文档类型必须匹配根元素的名字,比如我们例子中的conf?iguration. 在XML文档内部提供DTD不是很普遍,因为DTD会使文件长度变得很长.把DTD存储在外部会更具意义,SYSTEM声明可以用来实现这个目标.你可以指定一个包含DTD的URL,例如: 或者 警告:如果你使用的是DTD的相对URL(比如"conf?ig.