作业是
创建一个程序,接受并存储任何Winter的数据 奥运会。 该计划应接受并存储每个活动最多6个竞争者名称 以及他们参加的活动的名称。它也应该排序 仅显示奖牌获得者的事件的分数或次数 他们赢得的奖牌。
我已经创建了一个顺利进行的“事件”类,但是在尝试将“事件”对象写入文件并读取它时遇到了问题。
这是我创建新事件的方法:
public static void addEvent() {
File events = new File("events.dat");
Scanner input = new Scanner(System.in);
String eventName;
ArrayList<Event> olympics = new ArrayList<Event>();
boolean fileExists = false;
if (events.exists()) {
fileExists = true;
} else {
try {
events.createNewFile();
System.out.println("File created");
} catch (IOException e) {
System.out.println("File could not be created");
System.err.println("IOException: " + e.getMessage());
}
}
System.out.print("Enter name of event: ");
eventName = input.nextLine();
olympics.add(new Event(eventName));
//write Objects
try {
FileOutputStream out = new FileOutputStream(events, fileExists);
ObjectOutputStream writeEvent = new ObjectOutputStream(out);
writeEvent.writeObject(olympics);
writeEvent.close();
} catch (FileNotFoundException e) {
System.out.println("File could not be found.");
System.err.println("FileNotFoundException: " + e.getMessage());
} catch (IOException e) {
System.out.println("Problem with input/output.");
System.err.println("IOException: " + e.getMessage());
}
menu();
}// end addEvent()
我显示文件的方法:
public static void displayFile(File datFile) {
File events = datFile;
String output ="";
//read objects
try {
FileInputStream in = new FileInputStream(events);
ObjectInputStream readEvents = new ObjectInputStream(in);
ArrayList<Event> recoveredEvents = new ArrayList<Event>();
while (readEvents.readObject() != null) {
recoveredEvents.add((Event)readEvents.readObject());
}
readEvents.close();
for (Event e: recoveredEvents) {
//System.out.println(e + "\n");
output += e + "\n";
}
} catch(FileNotFoundException e) {
System.out.println("File does not exist or could not be found");
System.err.println("FileNotFoundException: " + e.getMessage());
} catch (IOException e) {
System.out.println("Problem reading file");
System.err.println("IOException: " + e.getMessage());
} catch (ClassNotFoundException e) {
System.out.println("Class could not be used to cast object.");
System.err.println("ClassNotFoundException: " + e.getMessage());
}
System.out.println(output);
menu();
}// end displayFile()
这是一个开始类,处理文件到目前为止很难解决。编辑:忘记提到当我尝试调用displayFile()时它会抛出一条带有“null”消息的IOException。
答案 0 :(得分:2)
你得到了EOFException
。当readObject()
到达流的末尾时,它不会返回null。检查Javadoc。抛出EOFException.
您应该单独捕获它,而不是将其视为需要报告的错误。
你扔掉了所有奇怪的元素。您的读取循环应如下所示:
while (true)
{
recoveredEvents.add((Event)readObject.readObject());
}
您无法附加到ObjectOutputStream
撰写的文件。当您在阅读时进入联接时,您将获得IOException: invalid type code AC
。有很多方法可以解决这个问题,但这些方法并不重要。保持文件打开。
new FileOutputStream()
创建文件。所有存在/ createNewFile之前只是浪费时间和空间。