【问题标题】:Non-Deprecated StringBufferInputStream equivalent不推荐使用的 StringBufferInputStream 等效项
【发布时间】:2011-01-10 15:30:06
【问题描述】:

我正在使用LogManager.readConfiguration(),它需要一个我希望其内容来自字符串的 InputStream。是否存在未弃用的 StringBufferInputStream 等效项,例如 ReaderToInputStreamAdaptor

【问题讨论】:

    标签: java string inputstream deprecated


    【解决方案1】:

    使用ByteArrayInputStream,并注意指定适当的字符编码。例如

    ByteArrayInputStream(str.getBytes("UTF8"));
    

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

    【讨论】:

    • 这行不通。 readConfiguration() 将流传递给Properties#load(InputStream),该方法期望流为ISO-8859-1,而不是UTF-8
    【解决方案2】:

    java.io.ByteArrayInputStream

    String s = "test";
    InputStream input = new ByteArrayInputStream(s.getBytes("UTF8"));
    

    【讨论】:

    • 这行不通。 readConfiguration() 将流传递给Properties#load(InputStream),该方法期望流为ISO-8859-1,而不是UTF-8
    • 然后他可以将ISO-8859-1编码传递给getBytes()
    【解决方案3】:

    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"));
    

    编辑:编码算法已更正

    EDIT2:其实java.util.Properties格式还有一些其他的限制(比如\和其他特殊字符的转义),见文档

    EDIT3: 0x00-0x1f 转义被移除,正如 Alan Moore 所建议的那样

    【讨论】:

    • 很好地了解特定于属性文件格式的 unicode 编码。只要s 是UTF-8,我相信这是正确的。
    • @Kaleb: s 将只是一个字符串,在相同的编码中字符串总是使用 - 你不需要担心这个。你只需要知道 target 编码,正如@axtavt 所说的ISO-8859-1
    • @axtavt:您的代码将对所有 TAB、换行、换页和回车字符进行 Unicode 转义,这是不对的。仅当它们是 Properties 键或元素的一部分时才需要对其进行转义,并且在调用此方法时应该已经处理好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2016-04-22
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多