关于RandomAccessFile类

我按照教程上说的,使用RandomAccessFile类,代码都是一样的,为什么我的运行结果却有问题呢,哪位高手帮忙看下,谢谢了

import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomFileTest {

/**
* @param args
*/
public static void main(String[] args) throws Exception {
Student s1 = new Student(1, "zhangsan", 98.5);
Student s2 = new Student(2, "lisi", 96.5);
Student s3 = new Student(3, "wangwu", 78.5);

RandomAccessFile raf = new RandomAccessFile("student.txt", "rw");
s1.writeStudent(raf);
s2.writeStudent(raf);
s3.writeStudent(raf);

Student s = new Student();
// 将文件指针设为起始位置
raf.seek(0);
for (long i = 0; i < raf.length(); i=raf.getFilePointer()) {
s.readStudent(raf);
System.out.println("编号"+s.num+"姓名"+s.name+"得分"+s.score);
}
raf.close();
}

}

class Student {
int num;
String name;
double score;

public Student(int num, String name, double score) {
this.num = num;
this.name = name;
this.score = score;
}

public Student() {

}

public void writeStudent(RandomAccessFile raf) throws IOException {
raf.writeInt(num);
raf.writeUTF(name);
raf.writeDouble(score);
}

public void readStudent(RandomAccessFile raf) throws IOException {
raf.readInt();
raf.readUTF();
raf.readDouble();
}
}
我按照你写的方法试了,成功了,可不知道我写的为什么运行不成功,逻辑错误具体错到哪儿了?

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

主要的错误是程序的逻辑错误,Student s = new Student(); 这句你new了一个新的学生,这个学生对象的num=0,name=null,score=0.0,你从student.txt文件中读出来的数据并没有赋值给s的各个分量,所以输出结果是:编号0姓名null得分0.0

下面是我的测试代码:

-------------------------------------------------------------------

for (long i = 0; i < raf.length(); i = raf.getFilePointer()) {
//s.readStudent(raf);
//System.out.println("编号" + s.num + "姓名" + s.name + "得分" + s.score);
System.out.println(raf.readInt()+" "+raf.readUTF()+" "+raf.readDouble()+"\n");
}

------------------------------------------------------------

如果就这个问题来说,我觉得用ObjectInputStream和ObjectOutputStream比较好理解一些

逻辑错误就是我上面说的,你生成一个student对象时,属性都是空值,你取得到的肯定都是空值了,这就是你的逻辑错误,你的想法是把从文件中读到的值赋值给对象,但是没有赋值。
温馨提示:内容为网友见解,仅供参考
无其他回答

《Java面向对象编程》导读-RandomAccessFile类随机读写文件
RandomAccessFile类不同于流类,它提供随机读写文件功能,可从文件任意位置执行操作。RandomAccessFile类实现了DataInput和DataOutput接口,因此能读写格式化数据。它有构造方法如下:构造方法的mode参数指定访问模式,可选“r”表示读,“rw”表示读写。仅读文件应选择“r”,读写文件选“rw”。注意,Rand...

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

用randomaccessfile流将一个文本文件倒置读出
public static void main(String args[]) { try { File file = new File("C:\\\\Users\\\\senn\\\\Desktop\\\\作业\\\\test.txt"); RandomAccessFile random = new RandomAccessFile(file, "rw"); long theLength = random.length(); while (theLength > 0) { random.seek(--...

FileChannel的问题,复制粘贴的滚远点
FileChannel的问题,复制粘贴的滚远点 第一次接触这段代码JAVA:FileLockflock=null;RandomAccessFilefis=null;try{fis=newRandomAccessFile("ty.lock","rw");\/\/获得文件通道FileChannellockfc=fis.getChannel();inti=10;wh... 第一次接触这段代码JAVA:FileLock flock = null; RandomAccessFile fis = null; t...

RandomAccessFile 中文件名应怎么写
RandomAccessFile 是一个很有用的类,可以将字节流写入到 磁盘文件中,对应的也可以从磁盘文件中读取出字节流,在 API 中关于 RandomAccessFile 的描述如下:此类的实例支持对随机访问文件的读取和写入。随机访问文 件的行为类似存储在文件系统中的一个大型 byte 数组。存 在指向该隐含数组的光标或索引...

谁能给我举个例子RandomAccessFile类
RandomAccessFile类用处还是很大的,读写文件非常方便,指针又可以任意移动,这里有个写入和读取的例子供你参考,你可以直接拷贝去编译和运行,慢慢体会一下:import java.io.IOException;import java.io.File;import java.io.RandomAccessFile;class RandomFileTest { public static void main(String[] args...

randomaccessfile写文件还是bufferedwrite快
小文件RandomAccessFile,大文件BufferedReader。RandomAccessFile在数据越大,性能越差。因为他是数据文件的一个channel,支持读改原数据文件。BufferedReader提供处理字符编码的方式,使用InputStreamReader或者DataInputStream之类的。

简述RandomAccessFile类的read方法和write方法 使用int类型存储byte数据...
"rws" 和 "rwd" 模式的工作方式极其类似 FileChannel 类的 force(boolean) 方法,分别传递 true 和 false 参数,除非它们始终应用于每个 I\/O 操作,并因此通常更为高效。如果该文件位于本地存储设备上,那么当返回此类的一个方法的调用时,可以保证由该调用对此文件所做的所有更改均被写入该设备。这...

关于RandomAccessFile类
主要的错误是程序的逻辑错误,Student s = new Student(); 这句你new了一个新的学生,这个学生对象的num=0,name=null,score=0.0,你从student.txt文件中读出来的数据并没有赋值给s的各个分量,所以输出结果是:编号0姓名null得分0.0 下面是我的测试代码:--- for (long i = 0; i < raf...

RandomAccessFile类中readInt()方法的返回值问题。
因为你以为的是文本文件,他以为的是二进制,他会读4个字节的数据,然后把他转换为int。在这里,你的数据是1234,作为文本,他们在文件中的表示比如说是ascii码,那么4个字节分别是31H,32H,33H,34H,如果你把十六进制数31323334H转换成十进制,你会发现,他的值就是825373492 ...

相似回答
大家正在搜