将InputStream读取为UTF-8

Chr*_*ehl 94 java inputstream utf-8

我试图text/plain通过互联网逐行读取文件.我现在的代码是:

URL url = new URL("http://kuehldesign.net/test.txt");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
LinkedList<String> lines = new LinkedList();
String readLine;

while ((readLine = in.readLine()) != null) {
    lines.add(readLine);
}

for (String line : lines) {
    out.println("> " + line);
}
Run Code Online (Sandbox Code Playgroud)

该文件test.txt包含¡Hélló!,我正在使用它来测试编码.

当我查看OutputStream(out)时,我将其视为> ¬°H?©ll??!.我不相信这是一个问题,OutputStream因为我可以out.println("é");没有问题.

阅读的任何想法都形成InputStreamUTF-8?谢谢!

Chr*_*ehl 178

解决了我自己的问题.这一行:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
Run Code Online (Sandbox Code Playgroud)

需要是:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
Run Code Online (Sandbox Code Playgroud)

或者从Java 7开始:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8));
Run Code Online (Sandbox Code Playgroud)

  • 从Java 7开始,可以编写提供Charset作为常量而不是字符串`StandardCharsets.UTF_8` (6认同)
  • 我很确定构造函数的形式不会在无效输入上引发异常.你需要使用`CharsetDecoder dec`参数.这与`OutputStreamWriter`构造函数具有相同的Java设计错误:只有四个中的一个实际上会出现问题,以便在出现问题时告诉您.你也必须在那里使用花哨的`CharsetDecoder dec`参数.唯一安全和理智的做法是考虑所有其他构造函数已被弃用,因为它们不能被信任. (3认同)

小智 15

String file = "";

try {

    InputStream is = new FileInputStream(filename);
    String UTF8 = "utf8";
    int BUFFER_SIZE = 8192;

    BufferedReader br = new BufferedReader(new InputStreamReader(is,
            UTF8), BUFFER_SIZE);
    String str;
    while ((str = br.readLine()) != null) {
        file += str;
    }
} catch (Exception e) {

}
Run Code Online (Sandbox Code Playgroud)

试试这个,.. :-)

  • 而不是文件+ = str,创建一个StringBuilder并追加到它.编译器可能能够优化字符串附加,但它可能会产生大量垃圾 (8认同)
  • UTF8 ="utf8",很好的变量;) (8认同)
  • 如果要将BufferedReader转换为字符串,请使用Apache Commons,不要重蹈覆辙:String myStr = org.apache.commons.io.IOUtils.toString(myBufferedReaderInstance); (2认同)

jos*_*and 7

每当发现特殊字符将其标记为??时,我都会遇到相同的问题。为了解决这个问题,我尝试使用以下编码:ISO-8859-1

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("txtPath"),"ISO-8859-1"));

while ((line = br.readLine()) != null) {

}
Run Code Online (Sandbox Code Playgroud)

我希望这可以对任何看到此帖子的人有所帮助。