Почему OutputStream должен быть закрыт после inputstream в Android

Я делаю два успешных вызова своего сервлета из Android следующим образом:

//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.


person Ashwin    schedule 14.03.2012    source источник
comment
Правильная причина уже была указана. «Ошибка в Android». Учитывая факты и то, что это работает в JRE, другого возможного объяснения нет.   -  person user207421    schedule 08.05.2012
comment
@EJP: Да, это ошибка, как вы сказали. Я имел в виду, в чем причина этой ошибки. Я имею в виду, закрывает ли Android соединение, когда выходной поток закрывается или происходит что-то еще.   -  person Ashwin    schedule 09.05.2012
comment
закрывает ли Android соединение, когда выходной поток закрыт. Да, видимо.   -  person user207421    schedule 09.05.2012


Ответы (1)


Мне кажется, это ошибка в Android.

В Java, откуда это происходит, закрытие ObjectOutputStream в любое время в течение HttpURLConnection ничего не делает, кроме сброса вывода (потому что соединение должно оставаться в рабочем состоянии, чтобы получить ответ). Закрытие входного потока HttpURLConnection закрывает все соединение, поэтому последующее закрытие ObjectOutputStream ничего не даст.

Я подозреваю, что Android делает что-то плохое с подключением, когда вы сначала делаете ObjectOutputStream.close(), например закрываете его.

Я бы вообще не стал ObjectOutputStream.close(), он вам не нужен ни на одной из платформ. flush() достаточно.

person user207421    schedule 15.03.2012
comment
Вы тоже испытывали это в andriod? - person Ashwin; 15.03.2012
comment
@ user1139023 Я вывел это из вашего поведения и моих знаний о платформе Java (TM). - person user207421; 15.03.2012
comment
Ты прав. Тот же код, выполненный на java, не вызывает никаких исключений и хорошо работает. - person Ashwin; 15.03.2012