使用RandomAccessFile写入学生数组时出现问题

3

我使用了 ArrayList 来打印一个学生商店,但是遇到了一些问题。后来我创建了一个静态数组来保存这些不同的学生,现在我正在尝试找出可以用来写入它们的方法。以下是我的代码:

MainApp
import java.io.RandomAccessFile;



    public class MainApp
    {

        public static void main(String[] args) throws Exception 
        {
            new MainApp().start();

        }
        public void start()throws Exception 
        {
            StudentStore details = new StudentStore();
            Student a = new Student("Becky O'Brien", "DKIT26", "0876126944", "bexo@hotmail.com");
            Student b = new Student("Fabio Borini", "DKIT28", "0876136944", "fabioborini@gmail.com");
            Student c = new Student("Gaston Ramirez", "DKIT29", "0419834501", "gramirez@webmail.com");
            Student d = new Student("Luis Suarez", "DKIT7", "0868989878", "luissuarez@yahoo.com");
            Student e = new Student("Andy Carroll", "DKIT9", "0853456788", "carroll123@hotmail.com");
            details.add(a);
            details.add(b);
            details.add(c);
            details.add(d);
            details.add(e);
            //details.print();


            RandomAccessFile file = new RandomAccessFile("ContactDetails.txt","rw");

            Student[] students = {a,b,c,d,e};
            for (int i = 0;i < students.length;i++)
            {
                file.writeByte(students[i]);
            }
            file.close();


         }


     }

这一行代码 file.writeByte(students[i]); 是错误的,我找不到适合的方法。错误信息显示类型为RandomAccessFilewriteByte(int)方法不适用于参数(Student)。显然,这是因为writeBytes方法不接受学生类型。


2
writeByte 需要一个整型参数,但你传入了一个完整的 Student 对象。 - JonH
正确。我知道这个。我想知道的是可以使用什么方法。 - Pendo826
你到底想要输出什么? - JonH
1
听起来你需要一个 BufferedWriter,并且简单地实现自己的 ToString() 方法来自定义学生打印输出的样式。 - JonH
2个回答

3

字符串有一种非常简单的方法可以转换为字节。它们有一个getBytes()方法,可以很好地工作。您可以通过重载toString()方法来获得学生的字符串表示形式。因此,您的调用看起来会像这样:

file.writeByte(students[i].toString().getBytes( "UTF-8" ));

编辑:

忘记了getBytes()返回一个字节数组。这应该可以工作:

byte[] bytes = students[i].toString().getBytes();
for(byte byteWrite : bytes){
    file.writeByte(byteWrite);
}

你覆盖了toString()方法吗? - nook
你如何覆盖它?我知道这是一个新手问题。但我以前从未这样做过。 - Pendo826
1
非常简单。只需在您的学生类中声明一个名为toString()的方法即可。请参见此处 - nook
@Pendo826 我也更新了我的回答。犯了一个小错误。 - nook
你在第一行从哪里获取了学生? - Pendo826
而且不需要覆盖toString方法。你可以有一个简单的toString方法,像这样: public String toString() { return "---------------------------学生信息--------------------------- " + "\n学生姓名:" + studentName + "\n学生ID:"+ studentId + "\n学生电话号码:"+ studentTelephoneNumber + "\n学生邮箱:" + studentEmail; } - Pendo826

0

RandomAccessFile旨在定位文件中的点并注入值,我不建议您在此情况下使用它。如果您只是想将这些行写入文件,则应使用BufferedWriter。它具备您所需的一切。

BufferedWriter file = new BufferedWriter(new FileWriter(filename));

然后进行写入,只需输入:

file.write(students[i]);

我应该提醒你,除非你有一个自定义的toString()方法,否则每个学生看起来都像垃圾。

如果你只想以不可读格式将对象写入文件,请查看{{link1:BufferedOutputStream}}。


我必须使用RandomAccessFile :( - Pendo826
你的教授只允许你使用RandomAccessFile?这似乎有点儿荒谬。 - Rob Wagner
教你只用一种方法做事似乎是软件开发领域一种不切实际的教学方式。 - Rob Wagner
我们已经完成了普通的文件 I/O。我在这方面相当擅长,但是在昨天之前,我从未听说过 RandomAccessFile。 - Pendo826
RAF(译注:可能是某种编程组件或库的缩写)有一些非常好的用途,但这不是它们的强项。虽然我很高兴你解决了问题!祝你在面对疯狂老师时好运! - Rob Wagner
谢谢,伙计。我相信还有很多错误需要找到哈哈。 - Pendo826

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接