Chris Hegarty wrote:
Failing java.io.PrintStream, java.io.PrintWriter, java.util.Scanner, and java.util.Formatter multi-arg constructors that take a java.io.File or String filename (as well as one or more additional args) opens a FileIn/OutputStream to the given File/filename. If one of the other given args causes the constructor to fail ( null or unsupported charset for example ) the FileIn/OutputStream is never closed, and the application does not have a reference to it. You rely on the finalizer to close the stream.

This is most serious on Windows because you cannot remove a file if there is an open handle to it.

I also cleaned up an existing regression test that fails in samevm mode (partly) because of this. And removed another excluded test from the list since its bug was fixed some time ago.

Webrev:
  http://cr.openjdk.java.net/~chegar/7000511/webrev.00/webrev/

-Chris.
It would be good to get this one fixed. If I understand the proposal correctly, there may still be side effects when NPE or UnsupportedEncodingException is thrown. When I say "side effects" I mean that an empty file may be created or an existing file truncated before the exception is thrown. I wonder you've tried to extend the list of parameters to the private constructors to avoid this. A toCharset(String) method should be used to lookup the Charset for example rather than having OutputStreamWriter to do it.

One minor comment is that I see that PrintStream is using java.util.Objects. Nice to see it being used but I wonder about loading yet another class during startup (System.out and err are PrintStreams and are initialized early in the startup).

-Alan

Reply via email to