2013-10-09 1 views
2

В этом проекте Java я работаю в университете, у меня есть ситуация, в которой я в настоящее время отправки строк через сеть успешно используяwriteUTF (String s) против writeObject (String ы)

streamOut = ObjectOutputStream 
streamIn = ObjectInputStream 

streamOut.writeUTF(msgs.peek()); 

где сбщ это связано блокирование очереди, получая его с

String in = streamIn.readUTF(); 

однако, я хотел бы использовать ObjectInputStream и ObjectOutputStream. Я инициализировал их как в конструкторе, так и я очищаю ObjectOutputStream после его создания, я где-то читал, что вы должны это делать.

Я хочу послать обе строки и другой тип объекта, назовем его Gameworld по сети (не заботятся об эффективности в данный момент) .. Однако, когда я

streamOut.writeObject("mad cuz i'm bad"); 

Object in = streamIn.readObject(); 
if(in instanceof String) String inS = (String) in; 

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

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

+0

ли вы имеете в виду, что 'Объект в = streamIn.readObject(); 'после этой строки в нуле? – smajlo

ответ

4

Существует значительная разница между написанием строки в потоке как примитивными данными или объектом. Строковый экземпляр, написанный writeObject, сначала записывается в поток как строка. Будущие вызовы writeObject() записывают ссылки на строку в поток.

Для примера

ByteArrayOutputStream baos1=new ByteArrayOutputStream(); 
    oos1=new ObjectOutputStream(baos1); 
    baos2=new ByteArrayOutputStream(); 
    ObjectOutputStream oos2=new ObjectOutputStream(baos2); 
    String testString="First"; 
    oos1.writeObject(testString); 
    oos2.writeUTF(testString); 
    testString="Second"; 
    oos1.writeObject(testString); 
    oos2.writeUTF(testString); 
    testString="Third"; 
    oos1.writeObject(testString); 
    oos2.writeUTF(testString); 
    oos1.flush(); 
    oos2.flush(); 
    byte[] byteArray1=baos1.toByteArray(); 
    byte[] byteArray2=baos2.toByteArray(); 

Dump последние два массива вы получите результат, как:
writeObject т.е. byteArray1
Binary: -19 0 -84 5 116 0 5 70 105 114 115 116 116 83 6 0 101 99 111 110 100 116 0 5 84 104 105 114 100
ASCII: -T - т Р рвые т S econd т Т ч IRD

writeUTF т.е. byteArray2
Двоичный: 0 -19 -84 5 22 119 0 5 70 105 114 115 116 0 6 83 101 99 111 110 100 0 5 84 104 105 114 100
ASCII: -T - ж F рвые S econd T Hird

Вывод: в случае writeObject ЭКСТРА данных (здесь т), подлежащие потоковой передаче, тогда как в случае writeUTF только строковые данные, подлежащие потоковой передаче.

Для более: http://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html#writeUTF(java.lang.String)

+0

Бум, прибил его. Спасибо, я не знал об этой ссылке, вот почему я и почему моя версия друзей работала, создавая новый поток каждый раз. –

+0

Нет никакой разницы между этими двумя гексами свалки. Вы отправили одно и то же дважды. Первый не согласуется с предоставленным ASCII-рендерингом. – EJP

0

Если вы хотите прочитать строку с помощью readObject(), вы должны записать ее с помощью writeObject().