2014-11-27 5 views
1

есть причина Eclipse, дает мне следующее предупреждение утечки ресурсов: утечки ресурсов:? «Бр» это никогда не закрыт» код, я говорю о том, в нижней части этого постаEclipse предупреждает о потенциальной утечке ресурсов, хотя у меня есть блок finally, который закрывает самый внешний поток, что мне не хватает?

Я думал, что я наконец-то. блок имел все это покрыто, мои рассуждения:

  • разрешения будет только нулем, если конструктор FileInputStream бросил и, следовательно, ничего не будет закрыто
  • Реза будет InputStream, если конструктор InputStreamReader бросков (искаженная строка кодирования для пример), а затем только входной поток должен быть закрыт s о порядке
  • и т.д ...

Так что мне не хватает? Или это может быть ошибка затмения?

С уважением!

С.

public static String fileToString(String fileName, String encoding) throws IOException { 
    InputStream is; 
    InputStreamReader isr; 
    BufferedReader br; 
    Closeable res = null; 
    try { 
     is = new FileInputStream(fileName); 
     res = is; 
     isr = new InputStreamReader(is, encoding); 
     res = isr; 
     br = new BufferedReader(isr); 
     res = br; 
     StringBuilder builder = new StringBuilder(); 
     String line = null; 
     while ((line = br.readLine()) != null) { 
      builder.append(line); 
      builder.append(LS); 
     } 
     return builder.toString(); 
    } finally { 
     if (res != null) { 
      res.close(); 
     } 
    } 
} 
+1

Кажется, все в порядке. Я думаю, что затмение просто не может правильно проанализировать код. – succcubbus

ответ

5

Eclipse, вероятно, просто не понимая перетасовки вы делаете с переменной res.

Я рекомендую использовать примерочных с-ресурсов заявление (доступно в Java   7 и выше, так что три с половиной года, теперь), что значительно упрощает эти виды цепей:

public static String fileToString(String fileName, String encoding) throws IOException { 

    try (
     InputStream is = new FileInputStream(fileName); 
     InputStreamReader isr = new InputStreamReader(is, encoding); 
     BufferedReader br = new BufferedReader(isr) 
    ) { 
     StringBuilder builder = new StringBuilder(); 
     String line = null; 
     while ((line = br.readLine()) != null) { 
      builder.append(line); 
      builder.append(LS); 
     } 
     return builder.toString(); 
    } 
} 

Если вы можете 't использовать try-with-resources, вы, вероятно, хотите что-то вроде Apache Commons IOUtils класса closeQuietly methods (либо буквально тот, либо ваш собственный), а не перетасовывать res вокруг, что неудобно читать, и я осмелюсь подвергнуть его обслуживанию.

Использование IOUtils может выглядеть следующим образом:

public static String fileToString(String fileName, String encoding) throws IOException { 
    InputStream is = null; 
    InputStreamReader isr = null; 
    BufferedReader br = null; 

    try { 
     is = new FileInputStream(fileName); 
     isr = new InputStreamReader(is, encoding); 
     br = new BufferedReader(isr) 
     StringBuilder builder = new StringBuilder(); 
     String line = null; 
     while ((line = br.readLine()) != null) { 
      builder.append(line); 
      builder.append(LS); 
     } 
     br.close(); 
     return builder.toString(); 
    } 
    finally { 
     IOUtils.closeQuietly(br, isr, is); 
    } 
} 

Обратите внимание, как я использую в try нормальный close, но затем обеспечить очистку в finally.

Но лучший ответ - лучший ответ, поскольку он более лаконичен и перехватывает новое (иш) «подавленное исключение».


Side Примечание: Там нет причин для = null инициализации line, вы назначаете его на следующей строке.

Сторона примечания 2: Если файл может быть любого размера, подумайте над тем, насколько он заблаговременно, и задайте емкость StringBuilder в конструкторе. StringBuilder по умолчанию - 16, поэтому файл из нескольких сотен байт включает в себя несколько перераспределений внутреннего буфера StringBuilder.

+1

Спасибо за ваш ответ (отмечен как принятый), а также за соответствующие советы, касающиеся попыток с ресурсами, строкостроителями и ненужной инициализацией нуля! – Skifozoa