gpt4 book ai didi

java - 我应该在何时何地使用 close() 方法来避免 ObjectInputStream 中的 IOException?

转载 作者:可可西里 更新时间:2023-11-01 02:55:28 25 4
gpt4 key购买 nike

我正在尝试通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com