StringBufferInputStream Java中的问题

1 java inputstream

我想读取一个输入字符串并将其作为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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想我找到了一个解决方案 - 各种各样:

private  String readInput(String jtext) {

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

            return null;
        }
                    }
Run Code Online (Sandbox Code Playgroud)

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

OpenOffice CSV(utf8)------> SQLite(显然是utf8)-------> java编码为Latin-1,不知何故可读.

Ste*_*n C 6

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

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

但是你的示例应用程序立即接受InputStream,将其转换为a Reader然后添加a BufferedReader 如果这是你的真正目标,那么更简单,更有效的方法就是这样:

Reader in = new StringReader(text);
Run Code Online (Sandbox Code Playgroud)

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

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

跟进

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

我的建议是要揣摩明确正在由数据库提供的字符数据的实际编码,那么请确保JDBC驱动程序配置为使用相同的编码.试图用一个编码和解码与编码另一撤消错误的翻译是不可靠的,并且可以给你只能等问题的部分修正.

您还需要考虑角色在进入数据库的过程中被破坏的可能性.如果是这种情况,那么您可能无法对它们进行去除.