首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java - StringTokenizer

Java - StringTokenizer
EN

Stack Overflow用户
提问于 2017-03-31 11:23:18
回答 1查看 104关注 0票数 0

免责声明:我昨天刚学会了怎么做,我非常绝望。

我有三个类(StudentClassScheduleClassEnrolment)

代码语言:javascript
复制
public class ClassEnrolment {
    ClassSchedule cs;
    Student stud;

    public ClassEnrolment(ClassSchedule cs, Student stud) {
        super();
        this.cs = cs;
        this.stud = stud;
     }
}

-----

public class Student{
    private String name;
    private String matricNo;
    ClassEnrolment classroom;
    ClassSchedule schedule;
}

-----

public class ClassSchedule {
    String classType;
    int index;
    int group;
    String day;
    String time;
    String venue;
    String remark;
    String courseCode;
}   

我正在尝试读/写一个文本文件(数据库)。我在"/////////////////"中有3行的问题。

我知道在ClassEnrolment中声明的属性不是int或string。我该怎么做?如何将ClassScheduleStudent作为StringTokenizer的一部分

文本文件存储来自ClassSchedule的索引和从Student存储的matricNo。我有一种感觉,我做错了。

代码语言:javascript
复制
    public static ArrayList readEnrolment(String filename) throws IOException {
    ArrayList stringArray = (ArrayList) read(filename);
    ArrayList alr = new ArrayList();

    for (int i = 0; i < stringArray.size(); i++) {
        String st = (String) stringArray.get(i);
        StringTokenizer star = new StringTokenizer(st, SEPARATOR);

        ///////////////////////////////////////////////////
        int cs = Integer.parseInt(star.nextToken().trim());
        String stud = star.nextToken().trim();
        ClassEnrolment enrolment = new ClassEnrolment(cs, stud);
        //////////////////////////////////////////////////
        alr.add(enrolment);
    }
    return alr;
}

public static void saveEnrolment(String filename, List al) throws IOException {
    List alw = new ArrayList();

    for (int i = 0; i < al.size(); i++) {
        ClassEnrolment enrolment = (ClassEnrolment) al.get(i);
        StringBuilder st = new StringBuilder();
        st.append(enrolment.getCs2());
        st.append(SEPARATOR);
        st.append(enrolment.getStud2());
        alw.add(st.toString());
    }
    write(filename, alw);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-31 12:27:32

这里的问题是Serialization的问题。您可以很好地将您的classEnrolment声明为Serializable(不要忘记serialUUID),并让经典的serialUUID序列化过程将对象作为字节写入您的文件中。

但是,您在这里尝试的是为您的类设想一个自定义序列化程序。我建议您在以下方面使用泛型:

代码语言:javascript
复制
public interface Serializer<T> {

    byte[] write(T objectToSerialize);

    //to build a factory/service around it
    boolean canDeserialize(byte[] serializedObject);

    T read(byte[] serializedObject);
}

这样,您的方法就可以简单地创建一个Serializer<ClassEnrollment>并让它完成它的工作(这可能会创建一个Serializer<Student>和一个Serializer<ClassSchedule>)。

关于序列化过程,我不得不说,StringTokenizer是JDK 1的遗留类,它的使用被它自己的javadoc阻止:

StringTokenizer是一个遗留类,由于兼容性原因而保留,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人使用String的拆分方法或java.util.regex包。

如果您想序列化具有潜在不同类的对象,而不仅仅是您的ClassEnrollment,那么最好能够区分所使用的类。有很多方法可以做到这一点,正如一位评论者所言,json序列化的效果会很好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43139459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档