ObjectInputStream 文件结束异常忽略 print 语句

ObjectInputStream End of file exception ignores print statements

提问人:user2852171 提问时间:12/10/2015 最后编辑:insertusernamehereuser2852171 更新时间:12/10/2015 访问量:72

问:

我正在通过 java 套接字将文件从 Google 眼镜设备读取到 PC。 由于 catch 语句引发的 eof 异常,我的代码的其余部分被忽略。我该如何解决这个问题?

代码:接收图像(并将其放入简单的 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);

客户端正在拍照并将文件发送到 PC:

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
infrom:\storage\emulated\0\DCIM\Camera\20151209_110536_982.jpg

Java 套接字 EOF

评论

0赞 Jon Skeet 12/10/2015
哪一行引发了异常?什么写了数据?(如果不是 ,则不应使用 ...ObjectOutputStreamObjectInputStream
0赞 user2852171 12/10/2015
我相信抛出异常的那句话是我认为它只是在完成时没有“停止”。我不太确定。发送方正在拍摄照片并将文件存储在 ObjectOutputStream 中,如下所示:ObjectInputStream inFromServer = new ObjectInputStream(clientimage.getInputStream());Socket pic_socket = new Socket(ip, 50505); ObjectOutputStream imageToServer = new ObjectOutputStream(pic_socket.getOutputStream()); imageToServer.writeObject(pictureToSend.getAbsoluteFile()); imageToServer.close();
0赞 Jon Skeet 12/10/2015
好吧,您应该能够从堆栈跟踪和调试中分辨出来。但鉴于你只是打电话,而且只有一次,你期望和做什么?我希望问题出在电话上。writeObejct()readBytereadUTFreadByte()
0赞 user2852171 12/10/2015
readByte 和 UTF 调用只是为了看看我是否可以获得有关图片的一些信息。理想情况下,我想在jFrame中获取图片,然后打印出高度和宽度。我最终确实在异常的 catch 语句上取出了打印堆栈跟踪,只是为了尝试保持程序运行。
0赞 Jon Skeet 12/10/2015
好吧,您根本没有显示 catch 块 - 目前很明显,您的代码由于要求读取更多数据而引发异常。你真的,真的需要提供有关异常的更多信息。你需要确定它被扔到哪里。现在,去掉 readUTF 和 readByte 调用。事实上,考虑到日志记录,看起来这些都是问题所在。

答:

1赞 Jon Skeet 12/10/2015 #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赞 user2852171 12/10/2015
我的输出似乎识别了温度(输出没有改变),我认为这可能是一个好兆头。如果您不介意的话,我唯一的其他问题与 BufferedImage 有关。我确实有一个 print 语句来显示图像的高度,但我不确定该代码是否正在运行。
0赞 Jon Skeet 12/10/2015
@user2852171:在这一点上,你真的需要开始学习如何使用调试器,这样你就可以单步执行代码。Stack Overflow 不是为“此位不起作用......现在这个位不起作用......现在这个位不起作用“的问题。