gpt4 book ai didi

java - Java 中的 StringBufferInputStream 问题

转载 作者:行者123 更新时间:2023-11-29 06:24:43 25 4
gpt4 key购买 nike

我想读取输入字符串并将其作为 UTF8 编码字符串返回。所以我在 Oracle/Sun 网站上找到了一个使用 FileInputStream 的例子。我不想读取一个文件,而是一个字符串,所以我将其更改为 StringBufferInputStream 并使用下面的代码。方法参数 jtext,是一些日语文本。 实际上这个方法很管用。问题是关于已弃用的代码。我不得不放置 @SuppressWarnings 因为 StringBufferInputStream 已被弃用。我想知道有没有更好的方法来获取字符串输入流?保持原样可以吗?我花了很长时间试图解决这个问题,现在我似乎已经破解了它,我不想改变任何东西。

            @SuppressWarnings("deprecation")
private String readInput(String jtext) {

StringBuffer buffer = new StringBuffer();
try {
StringBufferInputStream sbis = new StringBufferInputStream (jtext);
InputStreamReader isr = new InputStreamReader(sbis,
"UTF8");
Reader in = new BufferedReader(isr);
int ch;
while ((ch = in.read()) > -1) {
buffer.append((char)ch);
}

in.close();
return buffer.toString();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}

我想我找到了某种解决方案:

private  String readInput(String jtext) {

String n;
try {
n = new String(jtext.getBytes("8859_1"));
return n;
} catch (UnsupportedEncodingException e) {

return null;
}
}

在我绝望地使用 getBytes(UTF8) 之前。但我偶然使用了 Latin-1“8859_1”并且它起作用了。为什么它有效,我无法理解。这是我一步一步做的:

OpenOffice CSV(utf8)----->SQLite(utf8, apparently)------>java 编码为 Latin-1,以某种方式可读。

最佳答案

StringBufferInputStream 被弃用的原因是因为它从根本上被破坏了......除了完全由 Latin-1 字符组成的字符串之外的任何东西。根据 javadoc,它通过简单地切掉前 8 位来“编码”字符!如果您的应用程序需要正确处理 Unicode 等,您不想使用它。

如果您想从 String 创建一个 InputStream,那么正确的方法是使用 String.getBytes(...)String 转换为字节数组,然后将其包装在 ByteArrayInputStream 中。 (确保选择合适的编码!)。

但是您的示例应用程序会立即获取 InputStream,将其转换为 Reader,然后添加一个 BufferedReader 如果这是您的真正目标,那么一个更简单和更有效的方法就是这样:

Reader in = new StringReader(text);

这避免了不必要的字符串编码和解码,以及在这种情况下没有用处的“缓冲”层

(如果您在文件、网络或控制台流上执行小型 I/O 操作,缓冲流比无缓冲流更有效。但是对于从内存数据结构提供的流,好处是小得多,甚至可能是负数。)

跟进

我意识到你现在想做什么......解决字符编码/解码问题。

我的建议是尝试确定明确数据库传送的字符数据的实际编码,然后确保 JDBC 驱动程序配置为使用相同的编码。尝试通过一种编码编码和另一种编码解码来消除错误翻译是不明智的,而且只能给您部分纠正问题。

您还需要考虑字符在进入 数据库的过程中被破坏的可能性。如果是这种情况,那么您可能无法对它们进行分解。

关于java - Java 中的 StringBufferInputStream 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4532719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com