对象输出和输入问题,仅打印输入的第一行

发布于 2024-12-16 21:55:49 字数 1293 浏览 3 评论 0原文

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

输入:

 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");
}
}

I'm making a chat server for a class and am having issue logging messages for offline users. The data appends to the logfile as an object, it grows in size as you log more. When I login as the user who received a message it only returns the first message sent. I've spent a lot of time with this can can't figure out what I'm missing.

The input:

 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");
  }

The Output:

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");
}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

猫烠⑼条掵仅有一顆心 2024-12-23 21:55:50

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

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

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

ObjectInputStream 使用不属于它的数据可能会出现问题。

I don't think you can just append to an ObjectOutputStream like that. I think it would be possible if you do this:

For output, keep appending messages as you do now.

For input, open file as a byte input stream. Wrap this in a ObjectInputStream. When that object input stream has no more date, discard it, check the original byte input stream for more data, if it has more, then create a new ObjectInputStream and read data from that. Repeat until no more data exists in byte input stream.

There might be issues with ObjectInputStream consuming data not belonging to it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文