Проблемы с выходом объекта и вводом, выводит только первую строку на входе - PullRequest
1 голос
/ 20 ноября 2011

Я делаю чат-сервер для класса, и у меня возникают проблемы с регистрацией сообщений для офлайн-пользователей. Данные добавляются в файл журнала как объект, и их размер увеличивается по мере того, как вы ведете журнал. Когда я вхожу в систему как пользователь, получивший сообщение, он возвращает только первое отправленное сообщение. Я провел много времени с этим, не могу понять, что мне не хватает.

Ввод:

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

1 Ответ

1 голос
/ 20 ноября 2011

Я не думаю, что вы можете просто добавить объект ObjectOutputStream таким образом. Я думаю, что это будет возможно, если вы сделаете это:

Для вывода продолжайте добавлять сообщения, как сейчас.

Для ввода откройте файл в виде байтового потока ввода. Оберните это в ObjectInputStream. Когда у входного потока этого объекта больше нет даты, отмените его, проверьте исходный байтовый входной поток для получения дополнительных данных, если у него их больше, затем создайте новый ObjectInputStream и прочитайте данные из него. Повторяйте до тех пор, пока в потоке байтов больше не будет данных.

Могут быть проблемы с ObjectInputStream, использующим данные, не принадлежащие ему.

...