gpt4 book ai didi

java - 是否存在不带缓冲的 OutputStreamWriter?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:19:50 27 4
gpt4 key购买 nike

我需要转换 char 的流进入 byte 的流中s,即我需要来自 java.io.Writer 的适配器java.io.OutputStream 的接口(interface), 支持任何有效的 Charset我将把它作为配置参数。

然而,java.io.OutputStreamWriter类有一个隐藏的 secret :sun.nio.cs.StreamEncoder它委托(delegate)给下面的对象会创建一个 8192 字节 (8KB) 的缓冲区,即使您不要求它这样做也是如此。

问题是,在 OutputStream我插入了一个包装器,它需要计算正在写入的字节数,以便在输出特定数量的字节后立即停止源系统的执行。如果OutputStreamWriter正在创建一个 8K 缓冲区,我只是得到了生成的字节数的通知太晚了,因为它们只会在缓冲区刷新时到达我的计数器(所以已经有超过 8,000 个已经生成的字节在 OutputStreamWriter 缓冲区等着我。

所以问题是,在 Java 运行时的任何地方是否有一个 Writer -> OutputStream可以无缓冲运行的网桥?

我真的非常讨厌自己写这个 :(...

注意:在 OutputStreamWriter 上点击 flush() for each write 不是一个有效的选择。这会带来很大的性能损失(在 synchronized 处涉及一个 StreamEncoder block )。

注意 2:我知道可能有必要在桥上保留一个小的字符溢出以计算代理项。这并不是说我需要在它生成第 n 个字节的那一刻停止源系统的执行(这是不可能的,因为字节可以以更大的形式出现 byte[]write称呼)。但我需要尽快停止它,等待 8K、2K 甚至 200 字节的缓冲区刷新就太晚了。

最佳答案

因为您已经检测到 OutputStreamWriter 使用的 StreamEncoder 的缓冲区大小为 8KB,并且没有更改该大小的接口(interface)。

但下面的代码片段为您提供了一种为 OutputStream 获取 Writer 的方法,该 OutputStream 在内部也使用 StreamEncoder 但现在有一个用户-定义缓冲区大小:

String charSetName = ...
CharsetEncoder encoder = Charset.forName(charSetName).newEncoder();

OutputStream out = ...
int bufferSize = ...

WritableByteChannel channel = Channels.newChannel(out);
Writer writer = Channels.newWriter(channel, encoder, bufferSize);

关于java - 是否存在不带缓冲的 OutputStreamWriter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36809823/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com