2015-12-09 2 views
0

Я читаю файл с стеклянного устройства Google на ПК через java-сокет. Остальная часть моего кода игнорируется из-за исключения eof, созданного оператором catch. Идеи, как я могу это исправить?ObjectInputStream Исключение конца файла игнорирует утверждения печати

Код: чтобы получить изображение (и поместить его в простой jfame)

ObjectInputStream inFromServer = new ObjectInputStream(
clientimage.getInputStream()); 

System.out.println("infrom: " + inFromServer.readObject() + "\n"); 

System.out.println("infrom bytes: " + inFromServer.readByte() + "\n"); 
System.out.println("infrom something: " + inFromServer.readUTF()); 


File temp = (File) inFromServer.readObject(); 
BufferedImage image = ImageIO.read(temp); 
System.out.println("image height: " + image.getHeight()); 


JFrame frame = new JFrame(); 
JLabel label = new JLabel(new ImageIcon(image)); 
JFrame f = new JFrame(); 
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
f.getContentPane().add(label); 
f.pack(); 
f.setLocation(200,200); 
f.setVisible(true); 

Клиент съемки и отправки файла на ПК:

Socket pic_socket = new Socket(ip, 50505); 
ObjectOutputStream imageToServer = new ObjectOutputStream(pic_socket.getOutputStream()); 
imageToServer.writeObject(pictureToSend.getAbsoluteFile()); 
imageToServer.close(); 

Мой выход есть :

начиная подключение ..
изображение SRV соединено с: /192.168.1.104
заездаС: \ хранение \ эмулировать \ 0 \ DCIM \ Camera \ 20151209_110536_982.jpg

+0

Какая линия выбрасывает исключение? И что * записал * данные? (Если это не 'ObjectOutputStream', вы не должны использовать' ObjectInputStream' ...) –

+0

Я считаю, что строка, которая бросает исключение, это 'ObjectInputStream inFromServer = new ObjectInputStream (clientimage.getInputStream());' Я думаю, что это просто не «останавливается», когда это делается. Я не совсем уверен. Отправитель берет снимок и сохраняет файл в ObjectOutputStream следующим образом: 'Socket pic_socket = new Socket (ip, 50505); ObjectOutputStream imageToServer = new ObjectOutputStream (pic_socket.getOutputStream()); imageToServer.writeObject (pictureToSend.getAbsoluteFile()); imageToServer.close(); ' – user2852171

+0

Ну, вы должны быть в состоянии сказать, из трассировки стека и отладки. Но учитывая, что вы вызываете только 'writeObejct()', и только один раз, что вы ожидаете от 'readByte' и' readUTF'? Я ожидал бы, что проблема будет 'readByte()' вызовом. –

ответ

1

Выход вы показали показывает, что эта линия работает:

System.out.println("infrom: " + inFromServer.readObject() + "\n"); 

И эта линия бросает Исключение составляют:

System.out.println("infrom bytes: " + inFromServer.readByte() + "\n"); 

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

File temp; 
try (ObjectInputStream inFromServer = 
     new ObjectInputStream(clientimage.getInputStream()) { 
    temp = (File) inFromService.readObject(); 
} 
System.out.println("infrom: " + temp + "\n"); 

..., а затем избавиться от вызовов readByte() и readUTF(). Они соответствуют данным, которые не были написаны. Обратите внимание, что с приведенным выше кодом вы также вызываете только readObject(), что имеет решающее значение, поскольку был написан только один объект.

+0

Мой выход, кажется, распознает temp (выход не изменился), который, я думаю, может быть хорошим знаком. Единственный другой вопрос, который у меня есть, связан с BufferedImage, если вы не возражаете. У меня есть оператор печати, чтобы показать высоту изображения, но я не уверен, работает ли этот код. – user2852171

+0

@ user2852171: На этом этапе вам действительно нужно начать изучать, как использовать отладчик, чтобы вы могли пройти через код. Stack Overflow не предназначен для «Этот бит не работает ... теперь этот бит не работает ... теперь этот бит не работает». –