1

我正在为班级制作聊天服务器,并且在为离线用户记录消息时遇到问题。数据作为对象附加到日志文件中,随着您记录的更多,它的大小会增加。当我以收到消息的用户身份登录时,它只返回发送的第一条消息。我花了很多时间来解决这个问题,无法弄清楚我错过了什么。

输入:

 if (exists)
    ObjectInputStream in = null;

    try{
    in = new ObjectInputStream(new FileInputStream(uLog));
    Message msgs;
    Object obj = null;
        while ((obj = in.readObject()) != null)
        {
        msgs = (Message) obj;
        user.writeToUser(new Message("POST", "Offline Message from",  msgs.getTo() +" "+ msgs.getText()));
        }

    in.close();

           }catch (Exception e){//Catch exception if any
  System.err.println("Error: " + e.getMessage());
  }

  boolean success = uLog.delete();

  if (!success)
  throw new IllegalArgumentException("Delete: deletion failed");
  }

输出:

if(!usersList.getUserByName(msg.getTo()).getOnlineStatus())
{
   ObjectOutputStream out;
   try{
   out = new ObjectOutputStream(new FileOutputStream(msg.getTo() + ".log", true));
   user.writeToUser(new Message("PRIVATE", user.getUserName(), msg.getTo(), msg.getText()));
   out.writeObject(new Message("PRIVATE", msg.getTo(), user.getUserName(), msg.getText()));
   out.close();
   }
catch (IOException e){
System.out.println("Exception");
}
}
4

1 回答 1

1

我不认为你可以像这样附加到 ObjectOutputStream 。我认为如果你这样做是可能的:

对于输出,请像现在一样继续附加消息。

对于输入,将文件作为字节输入流打开。将其包装在 ObjectInputStream 中。当该对象输入流没有更多日期时,丢弃它,检查原始字节输入流是否有更多数据,如果有更多数据,则创建一个新的 ObjectInputStream 并从中读取数据。重复直到字节输入流中不再存在数据。

ObjectInputStream 使用不属于它的数据可能存在问题。

于 2011-11-20T11:01:21.663 回答