Java - InputStream

771
5
Есть такой код, читающий содержимое файла с URL:

Код:
URL url = null;
        InputStream html = null;
        StringBuffer buff = new StringBuffer();
        try{
            url = new URL(versionURL);
            html = url.openStream();
            int c;
            while((c = html.read()) != -1){
                buff.append((byte)c);
            }
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            try{
                 if(html != null){
                     html.close();
                 }
            }catch(IOException e){
                e.printStackTrace();
            }
        }

Вопрос: нужно ли в этом случае закрывать поток(InputStream) или нет?
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
А теперь спец-урок по сокращению кода от анти:
Код:
        try{
            StringBuffer buff = new StringBuffer();
            URL url = new URL(versionURL);
            InputStream html = url.openStream();
            int c = -1;
            while((c = html.read()) != -1){
                buff.append((byte)c);
            }
            html.close();        }catch(IOException e){
            e.printStackTrace();
        }
И да, по идее нужно. А учитывая, что я почти понял, зачем тебе это нужно, вот мой вариант:
Код:
    String ret = "UNKNOWN";
    try{
        DataInputStream dis = new DataInputStream(new URL("http://google.com").openStream());
        ret = dis.readUTF();
        dis.close();
    }catch(IOException e){
        //log..
    }
    return ret;
 
771
5
anti344 написал(а):
А теперь спец-урок по сокращению кода от анти:
Код:
        try{
            StringBuffer buff = new StringBuffer();
            URL url = new URL(versionURL);
            InputStream html = url.openStream();
            int c = -1;
            while((c = html.read()) != -1){
                buff.append((byte)c);
            }
            html.close();        }catch(IOException e){
            e.printStackTrace();
        }
И да, по идее нужно. А учитывая, что я почти понял, зачем тебе это нужно, вот мой вариант:
Код:
    String ret = "UNKNOWN";
    try{
        DataInputStream dis = new DataInputStream(new URL("http://google.com").openStream());
        ret = dis.readUTF();
        dis.close();
    }catch(IOException e){
        //log..
    }
    return ret;
Закрывать же надо в finally вроде.
P.S Я просто только начал с этим всем разбираться, так что извиняй если несу чушь =)
 
1,990
18
105
Да, закрывать лучше в finally. Может возникнуть такой момент, когда блок try из-за исключения не выполнится до конца и соединение останется открытым.
Да и если вылетит другое исключение (не наследник IOException) - тоже будет плохо и поток не закроется. Взять хотя бы деление на ноль.
 
771
5
Oldestkon написал(а):
Да, закрывать лучше в finally. Может возникнуть такой момент, когда блок try из-за исключения не выполнится до конца и соединение останется открытым.
Да и если вылетит другое исключение (не наследник IOException) - тоже будет плохо и поток не закроется. Взять хотя бы деление на ноль.
Спасибо!
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Нуок. Просто я не совсем понимаю, зачем сдался этот finally, если можно просто после блока закрыть.
 
1,990
18
105
А если вылетит исключение и поток даже не откроется? Будешь закрывать неоткрытый поток? Ладно он обработается, а что-то другое может вообще нарушить всю работу приложения.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
В таком случае(раз исключение не вследствие открытия потока) его можно на месте открыть.
 
Сверху