Java 使用Writer时设置内容长度?

Java 使用Writer时设置内容长度?,java,servlets,Java,Servlets,我正在做一些响应包装。使用OutputStream时,我可以确定字节数。但是,当使用Writer时,我将内容缓冲为char[],稍后用于写入输出 这是一个有点棘手的问题,但是当使用char[]时,如何确定真正的内容长度(我想设置标题-我知道我不必这样做,但我想要)?我的意思是,我可以使用使用的编码将字符转换为字节,然后刷新字节,但我想跳过另一个转换 还有其他想法吗?这取决于您使用的字符编码: 如果您使用的是8位编码(如Latin-1),并且只有可映射的字符要转换,则字符计数与字节计数相同 否则

我正在做一些响应包装。使用
OutputStream
时,我可以确定字节数。但是,当使用
Writer
时,我将内容缓冲为
char[]
,稍后用于写入输出

这是一个有点棘手的问题,但是当使用
char[]
时,如何确定真正的内容长度(我想设置标题-我知道我不必这样做,但我想要)?我的意思是,我可以使用使用的编码将字符转换为字节,然后刷新字节,但我想跳过另一个转换


还有其他想法吗?

这取决于您使用的字符编码:

  • 如果您使用的是8位编码(如Latin-1),并且只有可映射的字符要转换,则字符计数与字节计数相同

  • 否则,从技术上讲,可以计算出字符流将编码到1的字节数,但没有一种简单有效的方法



是的,但这是一个问题,我不知道前面的编码,用户可能会使用任何东西。除了转换成字节[]之外,我看不到任何其他实用的方法,我想这可能是在引擎盖下发生的

实际上,应该很容易判断编码是什么。在响应包装器上调用
getCharacterEncoding()
。如果在调用getWriter后执行此操作,则将使用用于创建编写器的编码。(至少,这是javadocs所暗示的…)



1-例如,使用UTF-8,您将首先实现
char
值到Unicode代码点的映射,然后计算每个代码点编码需要多少字节。这可以不用复制等,但你需要从头开始编码。。。除非你能找到一个第三方库来做这件事。

所以你的答案基本上是转换成
字节[]
?@不一定。见脚注。这取决于你是否准备做一些非琐碎的研究和编码。是的,但这是一个问题,我不知道前面的编码,用户可能会使用任何东西。除了转换成
byte[]
——我想这可能发生在引擎盖下,我看不到任何其他实用的方法。