Java-StringTokenizer

Java-StringTokenizer,java,Java,免责声明:我昨天刚学会如何做,我很绝望 我有三节课(学生,课程表,课程注册) 我正在尝试读/写一个文本文件(数据库)。我在“//中有3行出现问题 我知道classEnrollment中声明的属性既不是int也不是string。我该怎么做?如何将ClassSchedule和Student作为StringTokenizer的一部分 文本文件存储来自课程表的索引和来自学生的矩阵。我觉得我做得不对 public static ArrayList readEnrolment(String file

免责声明:我昨天刚学会如何做,我很绝望

我有三节课(
学生
课程表
课程注册

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

我知道
classEnrollment
中声明的属性既不是int也不是string。我该怎么做?如何将
ClassSchedule
Student
作为
StringTokenizer
的一部分

文本文件存储来自
课程表的索引和来自
学生的矩阵。我觉得我做得不对

    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);
}
publicstaticarraylistreadEnrollment(字符串文件名)引发IOException{
ArrayList stringArray=(ArrayList)读取(文件名);
ArrayList alr=新的ArrayList();
对于(int i=0;i
您这里的问题是一个安全问题。您可以很好地将
类注册
声明为
可序列化
(不要忘记serialUUID),并让经典的java序列化过程将对象作为字节写入文件中

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

public interface Serializer<T> {

    byte[] write(T objectToSerialize);

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

    T read(byte[] serializedObject);
}
公共接口序列化程序{
字节[]写入(T objectToSerialize);
//围绕它建立工厂/服务
布尔canDeserialize(字节[]序列化对象);
T读取(字节[]序列化对象);
}
因此,您的方法读/写回滚只需创建一个
序列化程序
,并让它完成它的工作(这可能会创建一个
序列化程序
和一个
序列化程序

关于序列化过程,我必须说StringTokenizer是来自JDK 1的遗留类,其使用受到其自身javadoc的阻碍:

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


如果您想序列化潜在不同类的对象,而不仅仅是您的类注册,那么最好能够区分所使用的类。有很多方法可以做到这一点,正如一位评论者所说,json序列化将非常顺利。

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

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

public interface Serializer<T> {

    byte[] write(T objectToSerialize);

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

    T read(byte[] serializedObject);
}
公共接口序列化程序{
字节[]写入(T objectToSerialize);
//围绕它建立工厂/服务
布尔canDeserialize(字节[]序列化对象);
T读取(字节[]序列化对象);
}
因此,您的方法读/写回滚只需创建一个
序列化程序
,并让它完成它的工作(这可能会创建一个
序列化程序
和一个
序列化程序

关于序列化过程,我必须说StringTokenizer是来自JDK 1的遗留类,其使用受到其自身javadoc的阻碍:

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


如果您想序列化潜在不同类的对象,而不仅仅是您的类注册,那么最好能够区分所使用的类。有很多方法可以做到这一点,正如一位评论者所说,json序列化将非常顺利。

通过创建对象的实例,可能
newclassschedule(theSchedule)
等等?可能(如果可以)可以使用json来保存/读回(例如,请参见Gson),问题是否需要您使用
StringTokenizer
?在我看来,这似乎是解决这个问题的糟糕方法。(不管怎样,您所做的是所谓的序列化或编组-您需要想出一种方法来将类表示为文本,并能够从一个类转换为另一个类。杂项建议:使用!
saveEnrollation
应以
列表为例。并返回接口,而不是具体的类(这样你以后就可以在不中断调用程序的情况下更改实现)-因此
read
应该返回
列表
,而不是
ArrayList
ArrayList
。我不能使用JSON:(谢谢大家!通过创建对象的实例,可能
新的类调度(theSchedule)
等等?可能(如果可以的话)您可以使用JSON保存/读回(例如,请参阅Gson)该问题是否需要您使用
StringTokenizer
?对我来说,这看起来像一个po