为什么要在android中的inputstream之后关闭OutputStream

时间:2012-03-14 12:21:16

标签: java android inputstream outputstream

我正在以这种方式对来自android的servlet进行两次succssive调用:

//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中的一个错误。

1 个答案:

答案 0 :(得分:4)

看起来像Android中的一个错误。

在Java中出现这种情况,在ObjectOutputStream之后随时关闭HttpURLConnection除了刷新输出外没有任何作用(因为连接必须保持接收响应)。关闭HttpURLConnection的输入流将关闭整个连接,因此后续关闭ObjectOutputStream将无效。

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

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