【问题标题】:Why should OutputStream be closed after inputstream in android为什么要在android中的inputstream之后关闭OutputStream
【发布时间】:2012-03-30 21:45:55
【问题描述】:

我正在以这种方式从 android 对我的 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 中的错误'。鉴于事实并考虑到它在 JRE 中有效,没有其他可能的解释。
  • @EJP :是的,就像你说的那样,这是一个错误。我的意思是这个错误的原因是什么。我的意思是当输出流关闭或发生其他事情时,android是否会关闭连接。
  • “当 outputstream 关​​闭时,android 是否关闭连接”。是的,显然。

标签: java android inputstream outputstream


【解决方案1】:

在我看来,这就像 Android 中的一个错误。

在 Java 中,在任何时候关闭 ObjectOutputStream 超过 HttpURLConnection 只会刷新输出(因为连接必须保持正常才能接收响应)。关闭 HttpURLConnection 的输入流会关闭整个连接,因此随后关闭 ObjectOutputStream 将无济于事。

我怀疑 Android 在您先执行 ObjectOutputStream.close() 时会对连接造成不良影响,例如关闭它。

我会完全省略ObjectOutputStream.close(),在任何一个平台上都不需要它。 flush() 就足够了。

【讨论】:

  • 你在安卓也经历过这种情况吗?
  • @user1139023 我是从您报告的行为和我对 Java(TM) 平台的了解中推断出来的。
  • 你是对的。在java中执行的相同代码没有任何异常并且运行良好。
猜你喜欢
  • 2021-06-12
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 2013-09-13
  • 2013-03-29
  • 2012-04-30
相关资源
最近更新 更多