Eliminate unnecessary buffering and encoding conversion in BufferedWriter
Brett Okken
brett.okken.os at gmail.com
Mon Jun 30 03:39:44 UTC 2025
Maybe another option would be to implement BufferedWriter with a
StringBuilder rather than a char[]. This would remove the force to utf-16
On Sun, Jun 29, 2025 at 10:36 PM Brett Okken <brett.okken.os at gmail.com>
wrote:
> Is StreamEncoder buffering content to only write to the underlying
> OutputStream when some threshold is hit? While the layers of conversions
> are unfortunate, it seems there could be negative performance implications
> of having many extremely small writes (such as 1 character/byte) at a time
> to the underlying OutputStream.
>
> Presumably this is a common pattern, as it is recommended:
>
> https://github.com/openjdk/jdk/blob/4dd1b3a6100f9e379c7cee3c699d63d0d01144a7/src/java.base/share/classes/java/io/OutputStreamWriter.java#L45
>
>
> On Sun, Jun 29, 2025 at 11:04 AM wenshao <shaojin.wensj at alibaba-inc.com>
> 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.
>>
>> -
>> Shaojin Wen
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/core-libs-dev/attachments/20250629/630816db/attachment.htm>
More information about the core-libs-dev
mailing list