将数据从List字段写入Java中的.txt文件

时间:2016-03-08 22:15:18

标签: java

我刚刚完成了以下程序 -

//interface IFile

package zad;

public interface IFile {
    void readFromFile();
}

//class Student

package zad;

public class Student implements Comparable {
    private String studentName;
    private int facNum, studentPoints;

    public Student(int facNum, String studentName, int studentPoints) {
        this.facNum = facNum;
        this.studentName = studentName;
        this.studentPoints = studentPoints;
    }

    public void setFacNum(int facNum) {
        this.facNum = facNum;
    }

    public int getFacNum() {
        return facNum;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    public String getStudentName() {
        return studentName;
    }

    public void setStudentPoints(int studentPoints) {
        this.studentPoints = studentPoints;
    }

    public int getStudentPoints() {
        return studentPoints;
    }

    public boolean equals(Object o) {
        if(o instanceof Student && ((Student) o).getFacNum() == this.facNum) {
            return true;
        } else {
            return false;
        }
    }

    public String toString() {
        return ("FacNum = " + facNum + ", name = " + studentName 
                + ", points = " + studentPoints );
    }

    public int compareTo(Object o) {
        return Integer.compare(this.facNum, ((Student)o).getFacNum());
    }



}

//class StudentsGroup

package zad;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class StudentsGroup implements IFile, Comparable {
    private String groupName;
    private List<Student> studentsList = new ArrayList<Student>();

    public StudentsGroup(String groupName) {
        this.groupName = groupName;
    }

    public void printArrayList() {
        for(Student o : studentsList)
            System.out.println(o);
    }

    public int compareTo(Object o) {
        if(getTotalPoints(studentsList) > getTotalPoints(((StudentsGroup)o).studentsList))
            return 1;
        else if(getTotalPoints(studentsList) < getTotalPoints(((StudentsGroup)o).studentsList))
            return -1;
        else 
            return 0;
    }

    public List getList() {
        return studentsList;
    }

    public static int getTotalPoints(List<Student> studentsList1) {
        int totalPoints = 0;
        for(Student o : studentsList1) {
            totalPoints += o.getStudentPoints();
        }
        return totalPoints;
    }

    public void sortByPoints() {
        Collections.sort(studentsList);
    }

    public void readFromFile() {
        Scanner sc;
        try {
            sc = new Scanner(new File(groupName));
            while(sc.hasNext()) {
                int facNum = sc.nextInt();
                String studentName = sc.next();
                int studentPoints = sc.nextInt();

                Student object = new Student(facNum, studentName, studentPoints);
                studentsList.add(object);
            }
        sc.close(); 
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    @Override
    public String toString() {
        return "StudentsGroup [groupName=" + groupName + ", studentsList=" + studentsList + "]";
    }
}

//class main

package zad;

import java.io.FileNotFoundException;

public class demo {

    public static void main(String[] args) throws FileNotFoundException {
        StudentsGroup studentsGroup1 = new StudentsGroup("D://test.txt");
        StudentsGroup studentsGroup2 = new StudentsGroup("D://test2.txt");
        studentsGroup1.readFromFile();
        studentsGroup2.readFromFile();
        studentsGroup1.printArrayList();
        studentsGroup1.sortByPoints();
        studentsGroup1.printArrayList();

        int compareResult = studentsGroup1.compareTo(studentsGroup2);

        switch(compareResult) {
            case 0: System.out.println("The two lists are equal by points.");
                    break;
            case 1: System.out.println("The first list is larger than the second.");
                    break;
            case -1: System.out.println("The first list is smaller than the second.");
                    break;
        }
    }

}

通常,它会从类StudentsGroup创建一个对象,从文件中读取并添加到ArrayList字段,作为另一个类的对象 - Student

我应该如何实现将数据写入新文件的方法?有什么想法?

注意:另外,如果可能的话,我想要一些关于编码的提示,以帮助我编写更好的代码。我在程序中做了一些完全错误或不必要的事情吗?方法getTotalPoints需要声明为静态,因此不予讨论。

更新:

当我尝试使用以下代码将数据写入文件时:

FileOutputStream out = new FileOutputStream("D://test3.txt"); 
ObjectOutputStream oout = new ObjectOutputStream(out); 
for(Student o : studentsList)
    oout.writeObject(o);
out.close();
oout.close();

我收到错误:

Exception in thread "main" java.io.NotSerializableException: zad.Student
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at zad.StudentsGroup.writeToFile(StudentsGroup.java:80)
    at zad.demo.main(demo.java:27)

我做错了吗?

1 个答案:

答案 0 :(得分:0)

根据ObjectOutputStream的the documentation,writeObject方法抛出NotSerializableException,因为Students没有实现Serializable。

  

NotSerializableException - 要序列化的某些对象不实现java.io.Serializable接口。

将您的类签名更新为以下内容,并实现Serializable所需的任何方法。

public class Student implements Comparable, Serializable

通过使用ObjectOutputStream.writeObject方法,您无法控制输出。如果要控制内容实际输出到文件的方式,您将要查看替代编写器。查看使用BufferedWriter的示例。然后,您可以将Student.toString()传递给编写器并控制数据显示的方式。例如,Student中的toString()方法可以输出field1 +&#34; \ t&#34; + field2 +&#34; \ t&#34; + field3 +&#34; \ t&#34; + field4 - 你基本上有一个制表符分隔的文件,然后你可以将其导入Excel。