没有缓冲的OutputStreamWriter是否存在?

时间:2016-04-23 10:51:08

标签: java buffer outputstream writer

我需要将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字节的缓冲区刷新就太晚了。

1 个答案:

答案 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"
    }
}