On Fri, 27 Jun 2025 16:48:40 GMT, Shaojin Wen <[email protected]> wrote:
> BufferedWriter -> OutputStreamWriter -> StreamEncoder
>
> In this call chain, BufferedWriter has a char[] buffer, and StreamEncoder has
> a ByteBuffer. There are two layers of cache here, or the BufferedWriter layer
> can be removed. And when charset is UTF8, if the content of write(String) is
> LATIN1, a conversion from LATIN1 to UTF16 and then to LATIN1 will occur here.
>
> LATIN1 -> UTF16 -> UTF8
>
> We can improve BufferedWriter. When the parameter Writer instanceof
> OutputStreamWriter is passed in, remove the cache and call it directly. In
> addition, improve write(String) in StreamEncoder to avoid unnecessary
> encoding conversion.
src/java.base/share/classes/java/io/BufferedWriter.java line 244:
> 242: }
> 243:
> 244: private static abstract sealed class BufferedImpl permits
> WriterImpl, OutputStreamWriterImpl {
No need to explicitly list the permitted subclasses when in the same
compilation unit:
Suggestion:
private static abstract sealed class BufferedImpl {
src/java.base/share/classes/java/io/BufferedWriter.java line 468:
> 466: }
> 467:
> 468: public void close() throws IOException {
These implement the package‑private methods from `BufferedImpl`, so they
probably should have `@Override` and don’t need to be `public`:
Suggestion:
@Override
void flushBuffer() throws IOException {
os.flushBuffer();
}
@Override
void write(int c) throws IOException {
os.write(new char[] {(char) c});
}
@Override
void write(char[] cbuf, int off, int len) throws IOException {
os.write(cbuf, off, len);
}
@Override
void write(String s, int off, int len) throws IOException {
os.write(s, off, len);
}
@Override
void flush() throws IOException {
os.flush();
}
@Override
void close() throws IOException {
Same applies to the regular `WriterImpl`.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/26022#discussion_r2173989119
PR Review Comment: https://git.openjdk.org/jdk/pull/26022#discussion_r2173990102