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

아웃풋 : 당신은 그냥 같은 ObjectOutputStream에에 추가 할 수 있다고 생각하지 않습니다

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

. 나는 이것을 할 수 있다고 생각한다 :

출력을 위해 지금처럼 메시지를 추가하십시오.

입력의 경우 파일을 바이트 입력 스트림으로 엽니 다. 이것을 ObjectInputStream에 랩합니다. 그 오브젝트 입력 스트림에 날짜가없는 경우는 그것을 파기 해, 원의 바이트 입력 스트림에 추가의 데이터가있는 경우는 그것을 체크해, 새로운 ObjectInputStream를 작성해 그 데이터를 읽어들입니다. 바이트 입력 스트림에 더 이상 데이터가 없을 때까지 반복하십시오.

ObjectInputStream에 속하지 않는 데이터를 사용하는 데 문제가있을 수 있습니다.

+0

바이트 입력을 받아서 ObjectInputStream으로 래핑하는 방법을 모르겠습니다. 이것에 대한 조언? – Joshua

+0

당신이하고 있습니다. FileInputStream은 바이트의 InputStream입니다. 그냥 계속 처리해 줘. –

관련 문제