我需要将char
的流转换为byte
的流,即我需要从java.io.Writer
接口到java.io.OutputStream
的适配器,支持任何有效的Charset
我将作为配置参数。
但是,java.io.OutputStreamWriter
类有一个隐藏的秘密:它委托给下面的sun.nio.cs.StreamEncoder
对象创建一个8192字节(8KB)的缓冲区,即使你不要求它。 / p>
问题是,在OutputStream
端,我插入了一个需要计算正在写入的字节数的包装器,以便它立即停止执行源系统已输出特定的字节数。如果OutputStreamWriter
正在创建一个8K缓冲区,我只会收到生成太晚的字节数的通知,因为它们只会在缓冲区刷新时到达我的计数器(所以在OutputStreamWriter
缓冲区中已经有超过8,000个已经生成的字节在等着我。
所以问题是, Java运行时中的任何地方都有Writer
- >可以无缓冲运行的OutputStream
网桥?
我真的,真的很讨厌自己写这个:( ...
注意:对于每次写入,在OutputStreamWriter
上点击 flush()不是有效的选择。这会带来很大的性能损失(synchronized
涉及StreamEncoder
块。
注意2 :我知道可能需要在桥上保留一个小的字符溢出来计算代理。并不是我需要在生成第n个字节的那一刻停止执行源系统(这是不可能的,因为字节可以以更大的{{1}的形式出现给我在byte[]
电话中。但是我需要停止它 asap ,等待8K,2K甚至200字节的缓冲区刷新就太晚了。
答案 0 :(得分:7)
正如您已经检测到OutputStreamWriter
使用的Writer
缓冲区大小为8KB,并且没有可以更改该大小的接口。
但是下面的代码段为您提供了一种获取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);
内部也使用{
"state":"online",
"message":"",
"description":"",
"append":"false",
"status":true,
"time":"Sat 23 Apr 2016 10:51:23 AM UTC +0000"
}
但现在具有用户定义的缓冲区大小:
{
"data": {
"id": 1,
"name": "Component Name",
"description": "Description",
"link": "",
"status": 1,
"order": 0,
"group_id": 0,
"created_at": "2015-08-01 12:00:00",
"updated_at": "2015-08-01 12:00:00",
"deleted_at": null,
"status_name": "Operational"
}
}