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