java RandomAccessFile的问题,输出不正确啊,怎么改能输出正确的名字和年龄。求指教

class Person{
private String name;
private int age;

public Person(String name, int age) {
if(name.length()>8)
name=name.substring(0, 8);
else if(name.length()<8)
name=name+"\u0000";
this.name = name;
this.age = age;

}
public String getName() {
return name;
}
public int getAge() {
return age;
}

}

public class FileAccessRamdoms {

public static void writes() throws Exception{
Person p1=new Person("jiaohch", 27);
Person p2=new Person("zhanght", 28);
Person p3=new Person("renjianliang", 26);

RandomAccessFile ff = new RandomAccessFile("youToBe.txt","rw");
ff.writeBytes(p1.getName());
ff.writeInt(p1.getAge());

ff.writeBytes(p2.getName());
ff.writeInt(p2.getAge());

ff.writeBytes(p3.getName());
ff.writeInt(p3.getAge());

if(ff !=null)
ff.close();
System.out.println("=======================");

}

public static void reads() throws Exception{
RandomAccessFile ff = new RandomAccessFile("youToBe.txt","rw");

System.out.println("跳过第一个人");
ff.skipBytes(12);
String name="";
for(int i=0;i<7;i++){
name=name+(char)ff.readByte();
}
System.out.println("name="+name);
System.out.println("age="+ff.readInt());

System.out.println("第三个");
name="";
for(int i=0;i<8;i++){
name=name+(char)ff.readByte();
}
System.out.println("name="+name);
System.out.println("age="+ff.readInt());

System.out.println("回到第一个");
ff.seek(0);
name="";
for(int i=0;i<7;i++){
name=name+(char)ff.readByte();
}
System.out.println("name="+name);
System.out.println("age="+ff.readInt());

}

public static void main(String[] args) throws Exception {

writes();
reads();
}

}

import java.io.RandomAccessFile;

class Person{
private String name;
private int age;

public Person(String name, int age) {
if(name.length()>8)
name=name.substring(0, 8);
else if(name.length()<8)
name=name+"\u0000";
this.name = name;
this.age = age;

}
public String getName() {
return name;
}
public int getAge() {
return age;
}

}

public class FileAccessRamdoms {

public static void writes() throws Exception{
Person p1=new Person("jiaohch", 27);
Person p2=new Person("zhanght", 28);
Person p3=new Person("renjianliang", 26);

RandomAccessFile ff = new RandomAccessFile("youToBe.txt","rw");
ff.writeBytes(p1.getName());
ff.writeInt(p1.getAge());

ff.writeBytes(p2.getName());
ff.writeInt(p2.getAge());

ff.writeBytes(p3.getName());
ff.writeInt(p3.getAge());

if(ff !=null)
ff.close();
System.out.println("=======================");

}

public static void reads() throws Exception{
RandomAccessFile ff = new RandomAccessFile("youToBe.txt","rw");

System.out.println("跳过第一个人");
ff.skipBytes(12);
String name="";
for(int i=0;i<7;i++){//此处你只read了7个字节。而name是都是8个字节所以下面读年龄时要越过一个字节
name=name+(char)ff.readByte();
}
System.out.println("name="+name);
ff.skipBytes(1);//前面你只read了7个字节。而name是都是8个字节所以下面读年龄时要越过一个字节
System.out.println("age="+ff.readInt());

System.out.println("第三个");
name="";
for(int i=0;i<8;i++){
name=name+(char)ff.readByte();
}
System.out.println("name="+name);
System.out.println("age="+ff.readInt());

System.out.println("回到第一个");
ff.seek(0);
name="";
for(int i=0;i<7;i++){//此处同理
name=name+(char)ff.readByte();
}
System.out.println("name="+name);
ff.skipBytes(1);//此处同理  还有如果是中文名字需要用writeChar readChar qqqun交流21、777/12
System.out.println("age="+ff.readInt());

}

public static void main(String[] args) throws Exception {

writes();
reads();
}

}

追问

多谢亲,还有两个不解的地方:
1、youTOBe文件里显示的是“jiaohch zhanght renjianl ”,看不到年龄啊?
2、else if(name.length()<8) name=name+"\u0000";后面的+"\u0000"啥意思?

追答

int使用的是一个4个字节保存的,这个并不影响读出,想显示出来必须转换为字符串
\u0000是已是一个Unicode字符,代表的应该是NULL,输出控制台是一个空格

温馨提示:内容为网友见解,仅供参考
无其他回答

java的randomaccessfile读写文件中文乱码问题
java中RandomAccessFile存取读写文件,需要用getBytes()先转换编码,中文乱码解决示例):package Iec104Config;import java.io.*;public class Test { public static void main(String[] args)throws IOException{ String stringToBeSaved="测\\naa"; FileWriter saveFile=new FileWriter("Test.txt...

RandomAccessFile用writeUTF时输出不正常
如果写字符串,最好不要用writeUTF,因为字符串的编码是不确定的,一般RandomAccessFile 打开文件都是iso-8859-1编码的,即使你的文件是utf-8的,写的时候最好用raf.write(byte[])

关于RandomAccessFile类
首先你的输出文件:student.txt命名有问题,在windows平台下,这个文件的长度,不是你写入数据的具体长度,平台可能会加上几个字符(你可以把第一个student对象的名字改成"a"实验一下),你的测试没有抛异常,可能是你的测试代码正好能组成一个.txt格式的文件,所以平台没有给你加字节。我觉得最好还是...

RandomAccessFile不明白的用法seek有代码请教谢谢了?
pos - 从文件开头以字节为单位测量的偏移量位置,在该位置设置文件指针。抛出:IOException - 如果 pos 小于 0 会发生 I\/O 错误。在你的例子中就是将RandomAccessFile的读取指针设置在0的位置,从0位开始读取数据^^^ 注意查看你读取的空格数量!看错了你是写进去,它只能定位文件中存在的,写进去2,...

java中RandomAccessFile的使用!?
RandomAccessFile是属于随机读取类,是可以对文件本身的内容直接随机进行操作的,可以在文件的指定位置 的读取和写入内容,这在很多时候都是很方便的。read()是从文件中读取内容,一次只读取一个字节,readByte里面的参数是一个byte数组,一次可以读取这个数组大小的数据。它返回的值就是实际读取了多个字节的...

java中用RandomAccessFile,如何读取文件中的中文
以下是java文档的解释:public final String readLine()throws IOException 从此文件读取文本的下一行。此方法可以从该文件的当前文件指针处成功地读取字节,直到到达行结束符或文件的末尾。每个字节都转换为一个字符,方法是采用该字符的低八位字节值,并将该字符的高八位设置为零。因此,此方法不支持完整的...

RandomAccessFile的readChar(),双数读出正确,单数不正常,数字编号不正 ...
首先要明白的是,java中一个字符(char)是2个字节 raf.seek(Integer.parseInt(s));这个方法的参数是指定偏移的字节数 seek方法参数 readChar方法读取位置 readChar读取内容 0 文件开始 第一个字符 1 第一个字节之后开始 第一个字符的第二个字节 第二个字符第一个字节 2 第二...

java中RandomAccessFile如何删除txt文件的某一行的信息和修改某一行...
1.File file = new File("c:\/a.txt");2.BufferedReader reader = new BufferedReader(file);3.byte[] strValue = new byte[(int)file.length()];4.String str = reader.read(strValue);\/\/按文件大小一次读入 5.String rows = str.split("\\r\\n");\/\/按换行符拆分,即数组的每一条,...

Java RandomAccessFile 和FileInputStream 问题
RandomAccessFile提供Data流的读写功能,可以把基本数据写到文本里,而且还能随意定位文件读取位置。FileInputStream只是普通的读取文件,按照文本的方式读取,就是当普通字符串处理,特殊类型数据没法解读,读出来就和乱码一样。

java 里面RandomAccessFile 里面的int read();方法,返回的的字范围是0...
read public int read()throws IOException 从此文件中读取一个数据字节。以整数形式返回此字节,范围在 0 到 255 (0x00-0x0ff)。如果尚无输入可用,将阻塞此方法。尽管 RandomAccessFile 不是 InputStream 的子类,但此方法的行为与 InputStream 的 InputStream.read()方法完全一样。返回:下一个数据...

相似回答