java - 使用 InputStreamReader 两次

标签 java utf-8 character-encoding inputstream

我必须在读取文件之前检查文件的编码。为了检查编码,我使用了这个方法:

        try {
            CharsetDecoder decoder= Charset.forName("UTF-8").newDecoder();
            decoder.onMalformedInput(CodingErrorAction.REPORT);
            decoder.onUnmappableCharacter(CodingErrorAction.REPORT);
            final InputStreamReader input = new InputStreamReader(is, decoder);
            int data = input.read();
            while(data != -1){
                data = input.read();
            }
            input.close();
        } catch (MalformedInputException e) {
            LOGGER.error(The file encoding is wrong!");
            throw new MalformedInputException(Math.toIntExact(file.length()));
        }
    }

下面是调用它的代码:

    InputStream is = new FileInputStream(file);
    checkFileEncoding(is);

    List<MyObject> list = newArrayList();
    try(CSVReader reader = new CSVReader(new InputStreamReader(is), ';')) {
        list =  reader.readAll().stream()
                .skip(1) // 
                .map(myObjectMap)
                .filter(o -> o != null)
                .collect(toList());
    }

问题是,当我之前调用 checkFileEncoding 时,我的列表是空的。我认为这是因为我读了我的文件两次。我应该怎么做?

最佳答案

final InputStreamReader input = new InputStreamReader(is, decoder);

您的 InputStreamReader 将从输入流中读取所有数据。这意味着不再有可用数据。此外,您已经将其关闭。

您需要创建一个 InputStream 两次。一次测试字符集,再一次实际读取数据。

所以改变

InputStream is = new FileInputStream(file);
checkFileEncoding(is);

InputStream is = new FileInputStream(file);
checkFileEncoding(is);
is = new FileInputStream(file);

也是在

之后
try(CSVReader reader ..
..
}

添加

is.close();

关于java - 使用 InputStreamReader 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38079518/

相关文章:

java - 具有不同查询参数类型的 Spring REST 端点

java - 将 Java 7 ODBC 类包含到 Java 8

java - Spring WebClient 从 Json 请求中过滤 Null

php - 在 zip php 中写入 unicode 文件名(linux 服务器)

MySQL 数据库 - 将字符集和排序规则转换为 utf8mb4 和 utf8mb4_unicode_ci?

java - 输入不是正确的UTF-8,指示编码

java - Java 枚举中重写的抽象方法中的代码问题

java - xml 解析中的 UTF-8 问题

PHP:urlencode() 是允许 URL 中包含有效 UTF-8 字符串的安全方法吗?

java - 为什么 POST 不支持字符集,但 AJAX 请求却支持? Tomcat 6