[jdom-interest] Re: SAXBuilder.build( File )
Jason Hunter
jhunter at xquery.com
Fri Nov 19 12:14:59 PST 2004
Hi Dave,
I'm not so sure it's a JDOM issue. build(File) converts the File to a
URL string, then wraps the URL string as an InputSource and passes the
InputSource to the SAXParser.parse() method. In other words, your File
goes in to the underlying SAX parser as a string rather than as a file
handle. It's therefore up to the SAX parser to close the file after it
opens it. InputSource doesn't even have a close() method since it has
no open() functionality.
Which parsers are you having trouble with?
Now if this is a common bug in SAX parsers we could add a workaround by
doing what you do below, but then I believe the SAXParser will lose the
ability to naturally resolve relative paths.
CCing the list in case people know more about this issue.
-jh-
Dave Jarvis wrote:
> Hi, guys.
>
> Sorry for not using the servlet archive and mailing list; it's big,
> unwieldy, tough to search, and severely limited in many respects. (I did
> search for about 15 minutes for this bug.)
>
> There is a bug in JDOM 1.0 with SAXBuilder.build( File ) (and likely
> build( URL )): the input stream is never closed. Since the file
> descriptor is not closed, this can eventually lead into a "too many open
> files" error (I have not tested this scenario; just a guess).
>
> On Windows platforms, however, if a file is parsed using build( File ),
> then that File object cannot subsequently be renamed because Windows
> locks open files.
>
> Windows test code:
>
> File file = new File( "file.xml" );
> SAXBuilder builder = getSAXBuilder();
> Document document = builder.build( file );
> boolean result = file.renameTo( new File( "renamed.xml" ) );
>
> if( !result ) System.out.println( "Rename Failed" );
>
> Under Unix, the file is renamed, as expected.
>
> The fix is trivial:
>
> File file = new File( "file.xml" );
> FileInputStream in = new FileInputStream( file );
> SAXBuilder builder = getSAXBuilder();
> Document document = builder.build( in );
> in.close();
> boolean result = file.renameTo( new File( "renamed.xml" ) );
>
> if( !result ) System.out.println( "Rename Failed" );
>
> I caught a suggestion by Brett that the build( File ) be removed, back
> in 2000. Because both File and URL have no way of getting any
> java.io.InputStream(Reader) that may be related to the object in
> question, I would recommend removing them.
>
> Sincerely,
> Dave Jarvis
More information about the jdom-interest
mailing list