2015-07-02 8 views
0

У меня есть этот фрагмент кода в моем приложении, и я совершенно уверен, что у меня есть закрыл все потоки.Java Resource Leak

Но, неудивительно, я продолжаю получать: Ресурс был получен при подключенной трассировке стека, но не был выпущен. См. Java.io.Closeable для получения информации об избежании утечки ресурсов. java.lang.Throwable: Явный метод завершения 'close' не называется

Любые указатели будут очень полезны.

if (fd != null) { 
    InputStream fileStream = new FileInputStream(fd.getFileDescriptor()); 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    byte[] buf = new byte[1024]; 
    try { 
     for (int readNum; (readNum = fileStream.read(buf)) != -1;) { 
      bos.write(buf, 0, readNum); 
     } 
     content = bos.toByteArray(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } finally { 
     try { 

      if (fileStream != null) { 
       fileStream.close(); 
      } 

      if (bos != null) { 
       bos.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

показать нам код –

+0

Извините, я пропустил добавление кода на вопрос. – iHavADoubt

ответ

1

попытка перемещения экземпляра потоков в try

InputStream fileStream = null; 
ByteArrayOutputStream bos = null; 
byte[] buf = new byte[1024]; 
try { 

    fileStream = new FileInputStream(fd.getFileDescriptor()); 
    bos = new ByteArrayOutputStream(); 
+0

Я думаю, что было бы лучше, если бы вы использовали try с ресурсами, который реализует AutoCloseable. https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html. Конечно, только если вы используете Java 7 или выше. –

1

Попробуйте использовать попробовать с ресурсами. Это устраняет необходимость закрытия ресурсов в блоке finally. https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

if (fd != null) { 
    byte[] buf = new byte[1024]; 
    try (InputStream fileStream = new FileInputStream(fd.getFileDescriptor()); 
     ByteArrayOutputStream bos = new ByteArrayOutputStream()) { 
     for (int readNum; (readNum = fileStream.read(buf)) != -1;) { 
      bos.write(buf, 0, readNum); 
     } 
     content = bos.toByteArray(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
}