【问题标题】:Stream closed error when getting charset获取字符集时流关闭错误
【发布时间】:2018-03-20 08:50:59
【问题描述】:

以下代码有问题:

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 error。我想是因为我使用了两次InputStream 项目并且它已经被消费了但我不确定。

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

提前非常感谢!

【问题讨论】:

  • charsetDetection 方法可能会读取流然后关闭它。

标签: java character-encoding inputstream bufferedreader


【解决方案1】:

是的,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");

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

在这种情况下,检测似乎没有使用mark/reset。非常合乎逻辑,因为这种技术只涉及部分内容。

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

【讨论】:

    猜你喜欢
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2016-03-02
    • 1970-01-01
    相关资源
    最近更新 更多