java - 获取字符集时流关闭错误

标签 java character-encoding inputstream bufferedreader

我在使用以下代码时遇到问题:

try (
      InputStream is = new FileInputStream(file);
      BufferedReader br = new BufferedReader(
                   new InputStreamReader(is,
                     Charset.forName(SidFileUtils.charsetDetection(is))
                   )
                 );
    ) {

        br.readLine();
        br.readLine();

        for (String line = br.readLine() ; line != null ; line = br.readLine()) {
            lines.add(line);
        }
    } catch (ExceptionTechnique | IOException e) {
        LOG.error("Erreur lors de la lecture du fichier " + file.getName(), e);
    }

这部分代码:Chasrset.forName(...) 给我一个Stream Closed 错误。我认为这是因为我使用了 InputStream 项两次并且它已经被消耗,但我不确定。

您能帮我理解这段代码有什么问题吗?

提前非常感谢!

最佳答案

是的,charsetDetection 没有其他选项可以进一步读取流。当特定的 InputStream 支持时,某些流可以标记和重置读取位置。

if (in.markSupported()) {
    final int maxBytesNeededForDetection = 8192;
    in.mark(maxBytesNeededForDetection);
    ... do the detection
    in.reset();
} else {
    throw IllegalState();
}

BufferedInputStream确实支持它,但仅限于缓冲区大小;否则会引发 IOException("Resetting to invalid mark");

然后应该在构造函数中指定缓冲区大小。

在这种情况下,检测似乎没有使用标记/重置。这是非常合乎逻辑的,因为这种技术的部分覆盖。

Charset charset = null;
try (InputStream is = new FileInputStream(file)) {
    Charset charset = Charset.forName(SidFileUtils.charsetDetection(is));
}
if (charset != null) {
    ...
}

关于java - 获取字符集时流关闭错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49379770/

相关文章:

java - 从 VB.net 过渡到 java

java InetAddress.getLocalHost();返回 127.0.0.1 ...如何获得真实 IP?

mysql 删除一个西里尔字母单词 选择一个西里尔字母单词

android - Resources.getSystem().openRawResource 给出资源未找到异常

java - 应用程序如何使用 JAR 中的文件进行读写?

java - 对数组进行排序,第一个和最后一个元素将形成 "pair"

java - 如何将nestedscrollview动画设置到底部

url - 可以在查询变量中使用的有效 URL 字符是什么?

java - ini4j字符编码

java - 在 Java 中将 InputStream 转换为字节数组