ChatGPT解决这个技术问题 Extra ChatGPT

将 InputStream 读取为 UTF-8

我正在尝试通过 Internet 逐行读取 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);
}

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

当我查看 OutputStream (out) 时,我将其视为 > ¬°H√©ll√≥!。我不认为这是 OutputStream 的问题,因为我可以毫无问题地执行 out.println("é");

InputStream 格式读取为 UTF-8 的任何想法?谢谢!

HTTP 协议指定编码。您为什么不使用为您处理这些问题的库 API?您永远不必像这样猜测编码。我并不是要消极:你做得很好!我只是想知道是否没有更简单的方法。
不幸的是,我无法访问提供 text/plain 文件的服务器,而且它没有使用 UTF-8 编码。我不知道有什么好的网络库。有什么建议么?
查看 docs,我认为您根本不需要指定编码。我很惊讶他们给了你一个字节流!您确实可以访问底层 URLConnection,您可以从中检查 Content-Encoding,然后使用正确的参数打开 InputStreamReader。对源代码的快速检查并没有发现任何似乎对你有用的东西,这看起来很糟糕而且容易出错,所以我可能错过了一些东西。

t
tobijdc

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

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

需要是:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));

或者从 Java 7 开始:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8));

我很确定构造函数的形式不会在无效输入上引发异常。您需要使用带有 CharsetDecoder dec 参数的 。这与 OutputStreamWriter 构造函数具有相同的 Java 设计错误:四个构造函数中只有一个实际上屈尊于告诉您何时出现问题。您还必须在那里使用花哨的 CharsetDecoder dec 参数。唯一安全和理智的做法是考虑弃用所有其他构造函数,因为不能信任它们的行为。
从 Java 7 开始,可以将提供的 Charset 编写为常量而不是字符串 StandardCharsets.UTF_8
A
Ahmed Ashour
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) {

}

尝试这个,.. :-)


而不是 file += str,创建一个 StringBuilder 并附加到它。编译器可能能够优化字符串附加,但它可能会产生大量垃圾
如果要将 BufferedReader 转换为字符串,请使用 Apache Commons,不要重蹈覆辙: String myStr = org.apache.commons.io.IOUtils.toString(myBufferedReaderInstance);
UTF8 =“utf8”,不错的变量;)
J
Joshua Joel Cleveland

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

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

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

}

我希望这可以帮助任何看到这篇文章的人。


您能否告诉 UTF-8 不支持的字符是什么?
g
grigouille

如果您使用构造函数 InputStreamReader(InputStream in, Charset cs),坏字符会被静默替换。要更改此行为,请使用 CharsetDecoder

public static Reader newReader(Inputstream is) {
  new InputStreamReader(is,
      StandardCharsets.UTF_8.newDecoder()
      .onMalformedInput(CodingErrorAction.REPORT)
      .onUnmappableCharacter(CodingErrorAction.REPORT)
  );
}

然后捕捉 java.nio.charset.CharacterCodingException