Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的StringBufferInputStream问题_Java_Inputstream - Fatal编程技术网

Java中的StringBufferInputStream问题

Java中的StringBufferInputStream问题,java,inputstream,Java,Inputstream,我想读取输入字符串并将其作为UTF8编码字符串返回。因此,我在Oracle/Sun网站上找到了一个使用FileInputStream的示例。我不想读取文件,而是一个字符串,所以我将其更改为StringBufferInputStream,并使用下面的代码。方法参数jtext是一些日文文本实际上,这种方法效果很好。问题是关于不推荐使用的代码。我不得不添加@SuppressWarnings,因为StringBufferInputStream已被弃用。我想知道有没有更好的方法来获取字符串输入流?让它保持

我想读取输入字符串并将其作为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)之前。但我碰巧用了拉丁语-1“8859_1”,效果不错。我搞不懂它为什么起作用。这是我一步一步做的:


OpenOfficeCSV(utf8)--->SQLite(显然是utf8)--->java编码为拉丁语-1,以某种方式可读。

这就是您想要做的吗?下面是关于这个问题的先前答案。我不知道为什么要将字符串转换为完全相同的字符串

Java字符串包含一个字符序列,其中每个字符表示一个Unicode数字。因此,可以从两个不同的字节序列构造相同的字符串,一个用UTF-8编码,另一个用US-ASCII编码

如果您想将其写入文件,则始终可以使用
String.getBytes(“编码器”)对其进行转换

更新

这是我的假设

UTF-16表示,根据您的评论,SQLite DB使用一种编码来存储文本值。由于某些原因,SQLite APi无法确定它用于将Unicode值编码为字节序列的编码

因此,当您从SQLite API中使用
getString
方法时,它会从数据库中读取一组字节,并使用错误的编码将它们转换为Java字符串。如果是这种情况,您应该使用
getBytes
方法自己重新构造字符串,即
新字符串(字节,“数据库中使用的编码”)如果数据库存储在UTF-16中,则
新字符串(字节,“UTF-16”)应该是可读的

更新

我不是在谈论
String
类上的
getBytes
方法。我谈到了SQL结果对象上的
getBytes
方法,例如
result.getBytes(String-columnLabel)

您需要将
readInput
方法的签名更改为

private static String readInput(byte[] bytes) {
    try {
        // change encoding to your DB encoding.
        // this can be UTF-8, UTF-16, 8859_1, etc.
        String string = new String(bytes, "UTF-8");
        return string;
    } catch (UnsupportedEncodingException ex) {
        // do something, at least return garbled text
        return new String(bytes, "UTF-8");;
    }
}
无论您在这里设置了什么样的编码使字符串可读,它肯定是您的列在DB中的编码。这不涉及无法解释的现象,您确切地知道列编码是什么

但是,最好将JDBC驱动程序配置为使用正确的编码,这样就不需要使用此
readInput
方法进行转换


如果没有编码可以使字符串读起来,你就需要考虑字符被写为DB的可能性,就像史蒂芬C所说的那样。如果是这种情况,使用漫游方法可能会导致在转换过程中丢失一些字符。您还需要在编写过程中解决编码问题。

这就是您要做的吗?下面是关于这个问题的先前答案。我不知道为什么要将字符串转换为完全相同的字符串

Java字符串包含一个字符序列,其中每个字符表示一个Unicode数字。因此,可以从两个不同的字节序列构造相同的字符串,一个用UTF-8编码,另一个用US-ASCII编码

如果您想将其写入文件,则始终可以使用
String.getBytes(“编码器”)对其进行转换

更新

这是我的假设

UTF-16表示,根据您的评论,SQLite DB使用一种编码来存储文本值。由于某些原因,SQLite APi无法确定它用于将Unicode值编码为字节序列的编码

因此,当您从SQLite API中使用
getString
方法时,它会从数据库中读取一组字节,并使用错误的编码将它们转换为Java字符串。如果是这种情况,您应该使用
getBytes
方法自己重新构造字符串,即
新字符串(字节,“数据库中使用的编码”)如果数据库存储在UTF-16中,则
新字符串(字节,“UTF-16”)应该是可读的

更新

我不是在谈论
String
类上的
getBytes
方法。我谈到了SQL结果对象上的
getBytes
方法,例如
result.getBytes(String-columnLabel)

您需要将
readInput
方法的签名更改为

private static String readInput(byte[] bytes) {
    try {
        // change encoding to your DB encoding.
        // this can be UTF-8, UTF-16, 8859_1, etc.
        String string = new String(bytes, "UTF-8");
        return string;
    } catch (UnsupportedEncodingException ex) {
        // do something, at least return garbled text
        return new String(bytes, "UTF-8");;
    }
}
无论您在这里设置了什么样的编码使字符串可读,它肯定是您的列在DB中的编码。这不涉及无法解释的现象,您确切地知道列编码是什么

但是,最好将JDBC驱动程序配置为使用正确的编码,这样就不需要使用此
readInput
方法进行转换

如果没有编码可以使字符串读起来,你就需要考虑字符被写为DB的可能性,就像史蒂芬C所说的那样。如果是这种情况,使用漫游方法可能会导致在转换过程中丢失一些字符。您还需要解决写入过程中的编码问题。

该类是不推荐的
StringBufferInputStream
类的新替代品

但是,您声明实际要做的是获取一个现有的
字符串
,并返回编码为UTF-8的字符串。我希望你能做得更简单。比如:

s8 = new String(jtext.getBytes("UTF8"));
这个班是新来的
s8 = new String(jtext.getBytes("UTF8"));
Reader in = new StringReader(text);