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

标签 java sockets networking tcp objectinputstream

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

相关文章:

java - Jface:如何强制Listviewer调整大小

java - 在 firebase 中使用随 secret 钥获取子节点数据的最佳方法?

java - java.util.HashMap 和 HashSet 的内部实现

C 应用程序在连接到服务器时卡住

c++ - 两台计算机与 2 个 c++ 程序之间的通信

java - 向 HashSet 输入有意义的相等数据

Java 如何使用 ObjectInputStream 进行读取

c - UDP C 套接字 : Multiple Sockets Sharing Single Port

c++ - 向多个客户端 UDP 发送数据时不支持地址族

php - 获取我的IP地址