为什么在Android中应该在InputStream之后关闭OutputStream

4

我正在以以下方式从安卓设备调用我的servlet进行两次连续调用:

//FIRST CONNECTION
URL url = new URL("http://172.16.32.160:8080/xyz/check_availability");
            HttpURLConnection connection =(HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            ObjectOutputStream out=new ObjectOutputStream(connection.getOutputStream());

            String a="xya";
            String b="xsw";
            out.writeObject(a);

            out.flush();


            ObjectInputStream in=new ObjectInputStream(connection.getInputStream());
            String s=(String)
            in.readObject();
            in.close();
            out.close();

                Toast.makeText(getApplicationContext(), "1", Toast.LENGTH_LONG).show();


            //SECOND CONNECTION 


            URL url1 = new URL("http://172.16.32.160:8080/xyz/check_availability");
            HttpURLConnection connection1 = (HttpURLConnection)url1.openConnection();
            connection1.setDoOutput(true);


            ObjectOutputStream out1=new ObjectOutputStream(connection1.getOutputStream());
            out1.writeObject(b);
            out1.flush();

            ObjectInputStream in1=new ObjectInputStream(connection1.getInputStream());
                String str=(String)
                in1.readObject();
                in1.close();
                out1.close();
                Toast.makeText(getApplicationContext(), "2", Toast.LENGTH_LONG).show();

上述代码之所以能正常工作,是因为我在关闭输入流之后关闭了第一个连接的输出流。但是如果我在发送对象后关闭输出流,第二个输入流会抛出异常:
java.io.StreamCorruptedException

为什么在关闭输入流之后应该关闭输出流呢?

注意
如果有人知道为什么在Android中不起作用的实际答案或正确原因,请回答。在那之前,我将接受EJP给出的答案 - 这是Android中的一个错误。

已经给出了正确的原因:“Android中的Bug”。鉴于事实并且在JRE中可以正常工作,没有其他可能的解释。 - user207421
@EJP:是的,就像你说的那样,这是一个bug。我的意思是,这个bug的原因是什么。我的意思是,当outputstream关闭时,Android是否会关闭连接,或者其他情况会发生。 - Ashwin
是的,显然安卓在输出流关闭时会关闭连接。 - user207421
1个回答

4

我认为这是Android系统中的一个bug。

在Java中,当使用ObjectOutputStream通过HttpURLConnection发送请求时,关闭输出流只会将数据刷新到服务器(因为连接必须保持打开状态才能接收响应)。但是,关闭输入流会同时关闭整个连接,所以在随后关闭ObjectOutputStream时不需要再做任何操作。

我怀疑Android在先执行ObjectOutputStream.close()时对连接进行了某些错误处理,导致连接被关闭。

我建议完全省略ObjectOutputStream.close(),因为在两个平台上都没有必要。只需使用flush()就足够了。


你在安卓上也遇到过这个问题吗? - Ashwin
@user1139023,根据您所报告的行为和我对Java(TM)平台的了解,我推断出这一点。 - user207421
你是对的。同样的代码在Java中执行时不会产生任何异常,并且能够正常工作。 - Ashwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接