从服务器(而不是文件)读取对象时出现Java EOFException

时间:2015-09-30 02:35:31

标签: java networking eofexception

所以,我像这样给客户写了一个对象:

ObjectOutputStream out = new ObjectOutputStream(client.getOutputStream());
out.writeObject(args);
out.close();

并在客户端接收对象,如下所示:

ObjectInputStream in = new ObjectInputStream(connection.getInputStream());

Object objIn;
while(true) {
    if((objIn = in.readObject()) != null) {
        //work with obj
    }
}

我从不在客户端创建输出流或在服务器端创建输入流。

此外,我发送的对象是可序列化的。

谢谢你的帮助!

编辑:这个问题的“重复”并没有帮助我回答我的问题,所以这个不是重复。

2 个答案:

答案 0 :(得分:0)

while(true) {
    if((objIn = in.readObject()) != null) {
        //work with obj
    }
}

Q值。你为什么要测试null?您打算发送null吗?因为那是你唯一一次得到一个。 答:因为您认为readObject()在流末尾返回null。虽然你遗漏了将逃脱无限循环的break

没有。抛出EOFException.所以你的循环应该是这样的:

try
{
    while(true) {
        objIn = in.readObject();
        //work with obj
    }
}
catch (EOFException exc)
{
    // end of stream
}
finally
{
    in.close();
}

答案 1 :(得分:-1)

假设您在从连接对象读取输入流时收到异常。

如果您已经在上面引用的输入流代码之前调用了connection.getInputStream(),您将收到EOF异常。因为连接对象中的输入流已被使用。

related topic

此问题的一个解决方案是将输入流的内容写入随机访问文件,因为它们使您能够遍历文件。

public static RandomAccessFile toRandomAccessFile(InputStream is, File tempFile) throws IOException
    {
        RandomAccessFile raf = new RandomAccessFile(tempFile, "rwd");
        byte[] buffer = new byte[2048];
        int    tmp    = 0;
        while ((tmp = is.read(buffer)) != -1)
        {
            raf.write(buffer, 0, tmp);
        }
        raf.seek(0);
        return raf;
    }

稍后您可以随时从文件中读取如下内容。

public static InputStream toInputStream(RandomAccessFile file) throws IOException
    {
        file.seek(0);    /// read from the start of the file 
        InputStream inputStream = Channels.newInputStream(file.getChannel());
        return inputStream;
    }