【问题标题】:EOFException initializing an ObjectInputStream初始化 ObjectInputStream 的 EOFException
【发布时间】:2018-05-03 02:06:04
【问题描述】:

我是新来的,我只会一点英语。好吧,我的问题是我必须做一个多线程服务器和一个客户端类才能将很多客户端与一台服务器通信。我将我的客户保存在一个 hashmap 中,添加到 hashmap 后,我使用一种方法写入文件(HashMap 是可序列化的,我使用单例模式使 hashmap 全局化)。问题是当我尝试从我的文件中读取数据时,Java 会抛出一个 EOFException,我不知道为什么。

这是我的代码:

import java.io.*;
import java.util.*;

public class MapaClients implements java.io.Serializable  {

private static MapaClients mapa= new MapaClients();

private Map<String,Client> clients= new HashMap<String,Client>();

private MapaClients(){}

public static MapaClients getInstance(){
    return mapa;
}

public void afegirMapa(String correu, Client client){
    clients.put(correu, client);
}

public Client existeix(String correu){
    if(clients.containsKey(correu)){
        return(clients.get(correu));
    }else{
        return(null);
    }
}

public void serializableGuardar(){
    try {
         FileOutputStream fileOut =new FileOutputStream("client.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(mapa);
         out.close();
         fileOut.close();
         System.out.printf("Serialized data is saved in client.ser");
      } catch (IOException i) {
         i.printStackTrace();
      }
}

public void desserializableCarregar(){
    ObjectInputStream in;
      try {
         FileInputStream fileIn = new FileInputStream("client.ser");
         in = new ObjectInputStream(fileIn);
         boolean check=true;
         while (check) {
            try{
                mapa = (MapaClients) in.readObject();
            } catch(EOFException ex){
                in.close();
                check=false;
            }
         }
         in.close();
         fileIn.close();
      } catch (IOException i) {
         i.printStackTrace();
      } catch (ClassNotFoundException c) {
         c.printStackTrace();
      }
}

public void actualizar(Client client){
    clients.replace(client.getCorreu(), client);
}
}

问题出在这里:

in = new ObjectInputStream(fileIn);

这是个例外:

java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at Proves.MapaClients.desserializableCarregar(MapaClients.java:46)

我希望你能帮助我,对不起我的英语:)

【问题讨论】:

  • 除了答案,因为你说你是编码新手,我希望你不介意一些代码 cmets: Remove java.io from 'implements java.io.Serializable' as you are importing java .io.*.你可以写‘return null’。使用正确的代码格式,无论您使用哪种 IDE,看看它是否有代码重新格式化,我使用 IntelliJ 作为我的 IDE。将 ObjectInputStream 移至其实现(在 try..catch 块内)。删除 Boolean check=true 并使用 ‘break;’ 表示 false。

标签: java serialization objectinputstream eofexception


【解决方案1】:

您正在尝试从一个空文件初始化ObjectInputStream

【讨论】:

  • 我第一次运行服务器时我知道是空的,但是当我使用服务器和客户端时它应该不为空。 public void serializableGuardar() 正确吗?感谢您的帮助。
  • 序列化代码看起来没问题,所以要么运行它有异常,要么你还没有运行它。检查磁盘上的文件。如果为空,请移除。
  • Okai,对不起。正如我所说,我是新手,对 Stackoverflow 了解不多。再次感谢我会尝试运行服务器并添加一些用户以查看文件是否仍然为空。
  • 那么另一个问题是它是如何变成零长度的?您需要考虑第一次运行该系统时会发生什么。它应该处理不存在的文件,但它不应该处理它的长度为零,因为这在正常操作中不会发生。
  • 非常感谢您帮助我。你是对的,我使用 If 更改了我的代码,以查看 tt 是否为空,如果它不为空,那么我读取了文件。现在我有 0 个异常或错误。我很高兴。谢谢 EJP :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多