我正在使用LogManager.readConfiguration()
,它需要一个InputStream,我希望这个InputStream的内容来自一个字符串。是否有类似于StringBufferInputStream
但未被弃用的替代方法,例如ReaderToInputStreamAdaptor
?
我正在使用LogManager.readConfiguration()
,它需要一个InputStream,我希望这个InputStream的内容来自一个字符串。是否有类似于StringBufferInputStream
但未被弃用的替代方法,例如ReaderToInputStreamAdaptor
?
ByteArrayInputStream(str.getBytes("UTF8"));
在处理字符时,需要考虑字符编码,以确定每个字符如何转换为一组字节。请注意,您可以使用默认的getBytes()
方法,并通过-Dfile.encoding=...
指定JVM运行时所使用的编码。
String s = "test";
InputStream input = new ByteArrayInputStream(s.getBytes("UTF8"));
readConfiguration()
将流传递给Properties#load(InputStream)
,而该方法期望流为ISO-8859-1
,而不是UTF-8
。 - Alan MooreLogManager.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所建议的那样
s
是UTF-8编码,我相信这是正确的。 - Kaleb Pedersons
只是一个字符串,使用与字符串始终相同的编码方式--您不必担心这个。 您只需要知道目标编码,即 @axtavt 所说的 ISO-8859-1
。 - Alan Moore
readConfiguration()
函数将流传递给Properties#load(InputStream)
函数,而该方法期望流为ISO-8859-1
,而不是UTF-8
。 - Alan Moore