If this approach is taken, I’d like to suggest using a ‘final’ var instead of 
‘null init/null check’, for example:

public AudioInputStream getAudioInputStream(File file)
        throws UnsupportedAudioFileException, IOException {

    final FileInputStream fis = new FileInputStream(file);
    try {
        return getAudioInputStream(new BufferedInputStream(fis));
    } catch(IOException|UnsupportedAudioFileException e) {
        throw e;
    } finally {
        fis.close();
    }
}


> On Jan 7, 2015, at 10:51 PM, Sergey Bylokhov <sergey.bylok...@oracle.com> 
> wrote:
> 
> On 08.01.2015 1:13, Phil Race wrote:
>> Its not clear to me if the bug description is implying an exception was 
>> thrown
> UnsupportedAudioFileException is thrown if the URL/File does not point to 
> valid audio file data recognized by the specific reader, so AudioSystem will 
> try to move to the next reader and a leak will occur.
> Actually most of our readers are affected.
>> Still, something like what you suggest seems to be needed. 
> right.
>> 
>> The owner of this bug is out until next week so I'll let him comment further 
>> after his return. 
>> 
>> -phil. 
>> 
>> On 01/07/2015 12:42 PM, Mike Clark wrote: 
>>> Hello all, 
>>> 
>>> I wanted to post this as a comment on 
>>> https://bugs.openjdk.java.net/browse/JDK-8013586 
>>> <https://bugs.openjdk.java.net/browse/JDK-8013586>, but apparently getting 
>>> comment access to that system is a bit of a hurdle.  Anyway.  What follows 
>>> is, I believe, a fix for the aforementioned bug: 
>>> 
>>> There is a file handle leak in some of the subclasses of 
>>> javax.sound.sampled.spi.AudioFileReader, such as 
>>> com.sun.media.sound.WaveFloatFileReader. 
>>> 
>>> Consider com.sun.media.sound.WaveFloatFileReader's method: 
>>> 
>>> public AudioInputStream getAudioInputStream(File file) 
>>>         throws UnsupportedAudioFileException, IOException { 
>>>     return getAudioInputStream( 
>>>         new BufferedInputStream(new FileInputStream(file))); 
>>> } 
>>> 
>>> See how there is no attempt to close the FileInputStream if an exception is 
>>> thrown?  A file handle will remain open on the file until garbage 
>>> collection is run. Since garbage collection may never run, the file handle 
>>> may remain open until the JVM exits. And on Windows the open file handle 
>>> prevents the file from being deleted, which is problematic. 
>>> 
>>> Could we fix it by adding a try/catch block? 
>>> 
>>> public AudioInputStream getAudioInputStream(File file) 
>>>         throws UnsupportedAudioFileException, IOException { 
>>>     FileInputStream fis = null; 
>>>     try { 
>>>         fis = new FileInputStream(file); 
>>>         return getAudioInputStream(new BufferedInputStream(fis)); 
>>>     } catch(IOException|UnsupportedAudioFileException e) { 
>>>         if (fis != null) { 
>>>             fis.close(); 
>>>         } 
>>>         throw e; 
>>>     } 
>>> } 
>>> 
>>> These AudioFileReader subclass methods are usually called by 
>>> javax.sound.sampled.AudioSystem.getAudioInputStream(File), which calls 
>>> getAudioInputStream(File) on all registered subclasses of AudioFileReader.  
>>> As such, all subclasses of AudioFileReader in the JRE should be reviewed 
>>> for this problem. 
>>> 
>>> best regards, 
>>> -Mike 
>>> 
>> 
> 
> 
> -- 
> Best regards, Sergey. 

Reply via email to