Как должны быть закрыты InputStream и OutputStream? - PullRequest
5 голосов
/ 05 ноября 2010

Я использую следующий код для закрытия InputStream и OutputStream из соединения с сервером:

try {
        if (mInputStream != null) {
            mInputStream.close();
            mInputStream = null;
        }

        if (mOutputStream != null) {
            mOutputStream.close();
            mOutputStream = null;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

Однако потоки не закрываются, они все еще живы.Если я подключусь снова, есть два разных InputStreams.В разделе catch нет никаких исключений.

Что я делаю не так?

1 Ответ

18 голосов
/ 05 ноября 2010

Две проблемы с вашим опубликованным кодом:

  1. Вызовы .close () должны обрабатываться в блоке finally.Таким образом, они ВСЕГДА будут закрыты, даже если они попали в блок catch где-то по пути.
  2. Вам нужно обрабатывать КАЖДЫЙ вызов .close () в своем собственном блоке try / catch, или вы можете оставить один изони сели на мельЕсли ваша попытка закрыть входной поток не удалась, вы пропустили бы попытку закрыть выходной поток.

Вы хотите что-то еще, похожее на это:

    InputStream mInputStream = null;
    OutputStream mOutputStream = null;
    try {
        mInputStream = new FileInputStream("\\Path\\MyFileName1.txt");
        mOutputStream = new FileOutputStream("\\Path\\MyFileName2.txt");
        //... do stuff to your streams
    }
    catch(FileNotFoundException fnex) {
        //Handle the error... but the streams are still open!
    }
    finally {
        //close input
        if (mInputStream != null) {
            try {
                mInputStream.close();
            }
            catch(IOException ioex) {
                //Very bad things just happened... handle it
            }
        }
        //Close output
        if (mOutputStream != null) {
            try {
                mOutputStream.close();
            }
            catch(IOException ioex) {
                //Very bad things just happened... handle it
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...