On 29/06/2025 17:03, wenshao 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.
LATIN1 (byte[]) -> UTF16 (char[]) -> UTF8 (byte[])
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.
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.
I see you've already proposed a PR. Most of this code goes back to JDK
1.4 so we need to be very careful, any changes will require a lot of
Reviewer cycles.
Have you surveyed the tests to ensure that there are good tests with
different charsets and usage patterns? I think we need to be confidence
in the tests before touching anything.
-Alan