非弃用的StringBufferInputStream等效替代方案

14
3个回答

9
使用 ByteArrayInputStream,并注意指定适当的字符编码。例如:
ByteArrayInputStream(str.getBytes("UTF8"));

在处理字符时,需要考虑字符编码,以确定每个字符如何转换为一组字节。请注意,您可以使用默认的getBytes()方法,并通过-Dfile.encoding=...指定JVM运行时所使用的编码。


这样不行。readConfiguration()函数将流传递给Properties#load(InputStream)函数,而该方法期望流为ISO-8859-1,而不是UTF-8 - Alan Moore

5

1
这样行不通。readConfiguration()将流传递给Properties#load(InputStream),而该方法期望流为ISO-8859-1,而不是UTF-8 - Alan Moore
3
他可以将ISO-8859-1编码传递给getBytes()函数。 - Kevin

4

LogManager.readConfiguration()的文档说明它接受java.util.Properties格式的数据。因此,真正正确的编码安全实现应该是这样的:

String s = ...;

StringBuilder propertiesEncoded = new StringBuilder();
for (int i = 0; i < s.length(); i++)
{
    char c = s.charAt(i);
    if (c <= 0x7e) propertiesEncoded.append((char) c);
    else propertiesEncoded.append(String.format("\\u%04x", (int) c)); 
}
ByteArrayInputStream in = new ByteArrayInputStream(propertiesEncoded.toString().getBytes("ISO-8859-1"));

编辑:编码算法已更正

编辑2:实际上,java.util.Properties格式还有其他限制(如转义\和其他特殊字符),请参阅文档

编辑3:已删除0x00-0x1f的转义,正如Alan Moore所建议的那样


针对属性文件格式的Unicode编码,你做得很好。只要s是UTF-8编码,我相信这是正确的。 - Kaleb Pederson
@Kaleb:s 只是一个字符串,使用与字符串始终相同的编码方式--您不必担心这个。 您只需要知道目标编码,即 @axtavt 所说的 ISO-8859-1 - Alan Moore
@axtavt:你的代码会对所有的TAB、换行符、换页符和回车符进行Unicode转义,这是不正确的。只有当它们是Properties键或元素的一部分时,才需要进行转义,而且在调用这个方法之前应该已经处理过了。 - Alan Moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接