CSR :
|
Summary ------- `java.io.PrintWriter` should inherit the charset if its `OutputStream` is an instance of `PrintStream`. Problem ------- `PrintWriter`, also `OutputStreamWriter` wraps an `OutputStream`, encoding the incoming stream into char stream. The charset used for encoding is either an explicitly specified one or the default charset. However, this can cause an encoding problem if the wrapped `OutputStream` is a `PrintStream` which has its own charset and can differ. With the JEP 400, this problem can arise even with the out-of-the-box environment. Solution -------- Inherit the charset used in the wrapped `PrintStream` on `Print/OutputStreamWriter` constructors that take `OutputStream` without explicit encoding. Specification ------------- Change the constructor of `OutputStreamWriter` that takes `OutputStream` without explicit encoding as follows: /** - * Creates an OutputStreamWriter that uses the default character encoding. + * Creates an OutputStreamWriter that uses the default character encoding, or + * where {@code out} is a {@code PrintStream}, the charset used by the print + * stream. * * @param out An OutputStream * @see Charset#defaultCharset() */ public OutputStreamWriter(OutputStream out) { Change the constructors of `PrintStream` that take `OutputStream` without explicit encoding as follows: @@ -122,11 +124,12 @@ } /** * Creates a new print stream, without automatic line flushing, with the * specified OutputStream. Characters written to the stream are converted - * to bytes using the default charset. + * to bytes using the charset in {@code out} if it is a {@code PrintStream}, + * or using the default charset. * * @param out The output stream to which values and objects will be * printed * * @see java.io.PrintWriter#PrintWriter(java.io.OutputStream) * @see Charset#defaultCharset() */ public PrintStream(OutputStream out) { @@ -137,10 +140,11 @@ } /** * Creates a new print stream, with the specified OutputStream and line * flushing. Characters written to the stream are converted to bytes using + * the charset in {@code out} if it is a {@code PrintStream}, or using * the default charset. * * @param out The output stream to which values and objects will be * printed * @param autoFlush Whether the output buffer will be flushed * whenever a byte array is written, one of the * {@code println} methods is invoked, or a newline * character or byte ({@code '\n'}) is written * * @see java.io.PrintWriter#PrintWriter(java.io.OutputStream, boolean) * @see Charset#defaultCharset() */ public PrintStream(OutputStream out, boolean autoFlush) { Change the constructors of `PrintWriter` that take `OutputStream` without explicit encoding as follows: @@ -116,11 +116,12 @@ /** * Creates a new PrintWriter, without automatic line flushing, from an * existing OutputStream. This convenience constructor creates the * necessary intermediate OutputStreamWriter, which will convert characters - * into bytes using the default charset. + * into bytes using the charset in {@code out} if it is a {@code PrintStream}, + * or using the default charset. * * @param out An output stream * * @see OutputStreamWriter#OutputStreamWriter(OutputStream) * @see Charset#defaultCharset() */ public PrintWriter(OutputStream out) { @@ -130,23 +131,24 @@ } /** * Creates a new PrintWriter from an existing OutputStream. This * convenience constructor creates the necessary intermediate - * OutputStreamWriter, which will convert characters into bytes using the - * default charset. + * OutputStreamWriter, which will convert characters into bytes using + * the charset in {@code out} if it is a {@code PrintStream}, or using + * the default charset. * * @param out An output stream * @param autoFlush A boolean; if true, the {@code println}, * {@code printf}, or {@code format} methods will * flush the output buffer * * @see OutputStreamWriter#OutputStreamWriter(OutputStream) * @see Charset#defaultCharset() */ public PrintWriter(OutputStream out, boolean autoFlush) {