Java 从服务器(不是文件)读取对象时出现 EOFException
Java EOFException While Reading Object From A Server (not a file)
所以,我像这样给客户端写了一个对象:
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
}
}
我从不在客户端创建输出流或在服务器端创建输入流。
此外,我发送的对象是可序列化的。
感谢您的帮助!
编辑:这个问题的 "duplicate" 没有帮助我回答我的问题,所以这个问题不是重复的。
while(true) {
if((objIn = in.readObject()) != null) {
//work with obj
}
}
问。为什么要测试 null
?您打算发送 null
吗?因为那是你唯一一次得到一个。
A. 因为你认为 readObject()
returns null
在流的末尾。尽管您遗漏了可以逃脱无限循环的 break
。
没有。它抛出 EOFException.
所以你的循环应该是这样的:
try
{
while(true) {
objIn = in.readObject();
//work with obj
}
}
catch (EOFException exc)
{
// end of stream
}
finally
{
in.close();
}
假设您在从连接对象读取输入流时收到异常。
如果您已经在上面引用的输入流代码之前调用了 connection.getInputStream()
,您将收到 EOF 异常。因为connection对象中的input Stream已经被消费了。
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;
}
所以,我像这样给客户端写了一个对象:
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
}
}
我从不在客户端创建输出流或在服务器端创建输入流。
此外,我发送的对象是可序列化的。
感谢您的帮助!
编辑:这个问题的 "duplicate" 没有帮助我回答我的问题,所以这个问题不是重复的。
while(true) {
if((objIn = in.readObject()) != null) {
//work with obj
}
}
问。为什么要测试 null
?您打算发送 null
吗?因为那是你唯一一次得到一个。
A. 因为你认为 readObject()
returns null
在流的末尾。尽管您遗漏了可以逃脱无限循环的 break
。
没有。它抛出 EOFException.
所以你的循环应该是这样的:
try
{
while(true) {
objIn = in.readObject();
//work with obj
}
}
catch (EOFException exc)
{
// end of stream
}
finally
{
in.close();
}
假设您在从连接对象读取输入流时收到异常。
如果您已经在上面引用的输入流代码之前调用了 connection.getInputStream()
,您将收到 EOF 异常。因为connection对象中的input Stream已经被消费了。
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;
}