我正在尝试通过 tcp 从客户端程序读取一个对象。正如您在这一行中看到的,我创建了 objectInput:
ObjectInputStream objectInput = new ObjectInputStream(incoming.getInputStream());
然后从其他程序读取我的输入。它曾经工作得很好,直到我做了一些小的改动来清理程序。个人假设我添加了
objectInput.clsoe();
我的问题是,读取对象后我应该关闭 objectInputStream 还是保持不关闭?我应该在使用后立即关闭它还是在 if block 结束时或程序结束时关闭它?关闭有什么影响?顺便说一句,我已经阅读了关闭文档。
这里是错误:
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2280)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2749)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:779)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279)
at Server.ClientWorker.run(MyCollectionServer.java:116)
at java.lang.Thread.run(Thread.java:680)
这是我的代码:
public static void main(String[] args) {
ServerSocket serverSocket = null;
try
{
serverSocket = new ServerSocket(port);
}
catch (IOException e)
{
e.printStackTrace();
}
while(true)
{
ClientWorker w;
try
{
w = new ClientWorker(serverSocket.accept());
Thread t = new Thread(w);
t.start();
}
catch(IOException e)
{
e.printStackTrace();
break;
}
}
}
}
class ClientWorker implements Runnable
{
.....
private Socket incoming;
public ClientWorker(Socket incoming)
{
myList = new ArrayList<PureAlbum>();
loadList();
this.incoming = incoming;
}
.....
public synchronized void run()
{
else if(request.compareTo("AddAlbum")==0)
{
try
{
ObjectInputStream objectInput = new ObjectInputStream(incoming.getInputStream()); //This is the line mentioned in the error
PureAlbum object = (PureAlbum) objectInput.readObject();
if(object instanceof CDAlbum)
{
CDAlbum a = (CDAlbum) object;
myList.add(a);
System.out.println("Artist = " + a.getArtist());
}
else if(object instanceof Client.au.edu.uow.Collection.DVDAlbum)
{
myList.add((DVDAlbum) object);
}
else
{
System.err.println("Warning : The object to add to database is unknown! "+ object.getClass() + "*");
System.exit(0);
}
}
catch (UnknownHostException e)
{
System.err.println("Can not read the host name");
e.printStackTrace();
}
catch (IOException e)
{
System.err.println("Can not read the FILE name"); //This exception has been called
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}
最佳答案
您的代码片段很长,所以我会尽量给您一个笼统的答案,希望对您有所帮助。
在 Java 7 之前,stream.close()
的典型使用模式是:
InputStream in = null;
try {
InputStream in = .....; // create your input stream;
// use input stream
} catch (IOException e) {
// do what you need here
} finally {
if (in != null) {
in.close();
}
}
或者简单地将方法声明为throws IOException
然后写:
InputStream in = null;
try {
InputStream in = .....; // create your input stream;
// use input stream
} finally {
if (in != null) {
in.close();
}
}
请注意,此示例不包含 catch
部分。
从 java 7 开始我们可以享受这门语言的新功能:
try (
InputStream in = .....; // create your input stream;
) {
// use input stream
}
您甚至根本不必调用 close()
。定义到 try block header 中且实现接口(interface) Closable
的所有资源都将自动关闭。
关于java - 我应该在何时何地使用 close() 方法来避免 ObjectInputStream 中的 IOException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12914454/