2016-01-26 6 views
3

У меня есть этот код:Должен ли я закрывать выходной поток, если я получаю FileNotFoundException? И IOException?

private void save(Bitmap bitmap) { 
     try { 
      FileOutputStream fos = new FileOutputStream(path); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, COMPRESSION_QUALITY, fos); 
      fos.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

Мне нужно закрыть FileOutputStream в FileNotFoundException поймать блок Do?

Если это исключение выбрано, это означает, что файл не может быть открыт, поэтому я думаю, что это было бы необязательно. Тем не менее, я думаю, было бы неплохо сделать это в блоке catch IOException.

Может ли это вызвать ошибку утечки памяти или что-то подобное, если я этого не сделаю?

Спасибо.

+1

В этом случае fos не открывается и fos будет null. Так что нечего закрывать. Пожалуйста попробуйте. – greenapps

+1

@greenapps Не равен нулю, просто никогда не назначается и выходит из области действия в блоке 'catch'. – EJP

+0

Вы должны начать с 'FileOutputStream fos = null;' вне блока catch, конечно. – greenapps

ответ

1

Если вы работаете в Java 7 или выше, вы должны использовать команду с ресурсами и позволить системе решить.

private void save(Bitmap bitmap) { 
    try (FileOutputStream fos = new FileOutputStream(path)) { 
     bitmap.compress(Bitmap.CompressFormat.JPEG, COMPRESSION_QUALITY, fos); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Если нет, то просто убедитесь, что поток не null первый и сделать это в finally.

private void save(Bitmap bitmap) { 
    FileOutputStream fos = null; 
    try { 
     fos = new FileOutputStream(path); 
     bitmap.compress(Bitmap.CompressFormat.JPEG, COMPRESSION_QUALITY, fos); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (fos != null) { 
      fos.close(); 
     } 
    } 
} 
0

Вы должны всегда закрывать файл после того, как закончите читать или писать. В противном случае вы оставите ресурс занятым и вообще может быть проблемой.
Если вы измените свой код таким образом, вам не придется заботиться о закрытии файла, и java подумает об этом.

private void save(Bitmap bitmap) { 
     try(FileOutputStream fos = new FileOutputStream(path)) { 
      bitmap.compress(Bitmap.CompressFormat.JPEG, COMPRESSION_QUALITY, fos); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

Не отвечает на вопрос. Вы не можете читать или писать, если есть «FileNotFoundException» или любое закрытие. – EJP

1

Невозможно закрыть. Конструктор FileOutputStream бросил исключение; поток никогда не строился; переменная fos никогда не назначалась; и он находится вне области действия в блоке catch.

Смежные вопросы