Yikes, Good point Klaus! Forgot the caller wants to actually use a valid stream 
for the non-exceptional case. Would have to move the is.close() back into a 
catch clause. I’ll try to post a better one later. (Any unit tests of this sort 
of thing exist in the tree now? - if not, I could try a unit test too).

> On Jan 9, 2015, at 12:34 PM, Klaus Jaensch <kla...@phonetik.uni-muenchen.de> 
> wrote:
> 
> Hi Dan,
> 
> Am 09.01.2015 um 05:37 schrieb Dan Rollo:
>> Even better, no need for the “catch/throw” chunk, because the method 
>> declares those caught exceptions:
>> 
>> 
>> public AudioInputStream getAudioInputStream(File file)
>>         throws UnsupportedAudioFileException, IOException {
>> 
>>     final FileInputStream fis = new FileInputStream(file);
>>     try {
>>         return getAudioInputStream(new BufferedInputStream(fis));
>>     } finally {
>>         fis.close();
>>     }
>> }
> 
> I think your code will not work. If the call to  
> getAudioInputStream(InputStream) succeeds the code always closes the stream 
> before it is returned. 
> 
> 
> I suggest this approach:  
> 
> public AudioInputStream getAudioInputStream(File file)
>             throws UnsupportedAudioFileException, IOException {
>         FileInputStream fis=new FileInputStream(file);
>         BufferedInputStream bis=new BufferedInputStream(fis);
>         AudioInputStream ais=null;
>         try{
>             ais=getAudioInputStream(bis);
>         } catch(IOException|UnsupportedAudioFileException e) { 
>             if(bis!=null){
>                 bis.close();
>             }
>             throw e;
>         }
>         return ais;
>     }
> 
> Closes the BufferedInputStream as well as the underlying FileInputStream.
> 
> I think the method:
> public AudioInputStream getAudioInputStream(URL url)
> 
> needs to be changed in the same way.
> 
> 
> Best regards,
> Klaus
> 
> 
>> 
>> 
>>> On Jan 7, 2015, at 11:41 PM, Dan Rollo <danro...@gmail.com 
>>> <mailto:danro...@gmail.com>> wrote:
>>> 
>>> 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 
>>>> <mailto: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. 
>>> 
>> 
> 
> 
> -- 
> ------------------------------------------
> Klaus Jaensch
> Muenchen
> Germany
> 
> Institut fuer Phonetik und Sprachverarbeitung
> Schellingstr.3/II
> Room 223 VG
> 80799 München
> 
> Phone (Work): +49-(0)89-2180-2806
> Fax:          +49-(0)89-2180-5790
> EMail: kla...@phonetik.uni-muenchen.de 
> <mailto:kla...@phonetik.uni-muenchen.de>

Reply via email to