2017-01-30 12 views
-1

Что я хочу достичь: когда я сохраняю объект Integer в файл с помощью метода writeObject() из класса ObjectOutputstream, я хочу перезаписать старый объект Integer и заменить его новым. Но я не хочу закрывать и открывать снова поток каждый раз, когда я хочу поместить новый объект Integer. Я просто хочу обновить его новыми значениями.ObjectOutputstream перезаписывает старый объект без закрытия потока

Решение, которое я придумал, не помогло мне. Вот код:

ObjectOutputStream stream1 = new ObjectOutputStream(new FileOutputStream(new File("ClientBase"), false)); 

stream1.writeObject(new Integer(2)); 

stream1.flush(); 
stream1.reset(); 

stream1.writeObject(new Integer(9)); 
stream1.close(); 

Когда я прочитал это, у меня есть два Integer объекты вместо Integer со значением 9 заменен Integer со значением 2.

Если я кладу это так, он работает.

ObjectOutputStream stream1 = new ObjectOutputStream(new FileOutputStream(new File("ClientBase"), false)); 

stream1.writeObject(new Integer(2)); 
stream1.close();  

stream1 = new ObjectOutputStream(new FileOutputStream(newFile("ClientBase"), false)); 

stream1.writeObject(new Integer(9)); 
stream1.close(); 

Мой вопрос: Могу ли я с помощью метода reset() в неправильном направлении, и есть ли другой способ достичь перезапись без открытия/закрытия потока?

+0

Это поток, не случайный предмет доступа. Вы пишете в поток два объекта, вы будете читать из него два объекта. Ваш вопрос не имеет смысла. – EJP

+0

Итак, единственный способ снова закрыть и открыть поток? –

+0

Не только поток, но и файл *. NB Вы считаете, что консультируетесь с Javadoc перед публикацией? Ничто там не поддерживает ваше предположение. – EJP

ответ

-1

Это то, что я пробовал.

Однако, обратите внимание, что я не уверен, что этот код является безопасным ...:

public static void main(String[] args) { 
    try (FileOutputStream fos = new FileOutputStream("objects.file"); 
      ObjectOutputStream os = new ObjectOutputStream(fos)) { 
     long position = fos.getChannel().position(); 
     os.writeObject(new Integer(2)); 
     os.flush(); 
     os.reset(); // added line 
     fos.getChannel().position(position); 
     os.writeObject(new Integer(9)); 
     os.flush(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Это то, что вы * закодировали *. Вы не пробовали. Это не сработает. Полученный файл будет вызывать 'StreamCorruptedException', если он предоставлен' ObjectInputStream'. – EJP

+0

Собственно, вы правы. Я добавил 'os.reset();' – SlumpA

+0

По-моему, вы не должны использовать это. Я думаю, что безопаснее закрыть и использовать новый ObjectOutputStream. Однако даже в этом случае вы можете повредить остальную часть файла. – SlumpA