如何在Java中读取使用不受支持的编码和/或字符集的文件

时间:2019-01-16 19:11:00

标签: java csv opencsv mac-roman

我需要将CSV文件读入Java应用程序,但是该文件是使用Western(Mac OS Roman)编码的,而Java不支持该文件。

建议我使用字节流读取文本并将超过128的所有内容转换为空格字符(ASCII字符32)。但是我不知道该怎么做。我不知道如何一次处理每个字节,如何转换它们,当我到达该行的末尾时,该如何截取该行“截断的”文本,将其拆分为一个数组,然后然后从我需要的索引中提取数据。

SortedMap<String, OBJ_NAME> mapResults = new TreeMap<String, OBJ_NAME>();
String url = 'url-to-file';
InputStream inputStream = null;
InputStreamReader = null;
CSVReader = csvReader = null;
final Pattern regexPattern = Pattern.compile("^\\d{2}\\.\\d{1.3}$");

try {
    inputStream = new URL(url).openStream();

    reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
    csvReader = new CSVReader(reader, ',', '"', 1);
    List<String[]> lines = csvReacer.readAll();

    for (String[] line : lines) {
        // logic to grab data from first and second indices of the line
        OBJ_NAME objInstance = new OBJ_NAME();

        objInstance.setFieldOne(line[0]);
        objInstance.setFieldTwo(line[1]);
        mapResults.put(line[1], objInstance);
    }
} catch (Exception e) {
    throw new IOException(e);
} finally {
    // IOUtils from apache commons
    IOUtils.closeQuietly(inputStream);
    IOUtils.closeQuietly(reader);
    IOUtils.closeQuietly(csvReader);
}

由于CSV使用的是不受支持的格式,因此上面的逻辑错误地读取了数据,因为它不是UTF-8,因此得到的结果比应有的少得多。我不确定是否应该以ASCII和“中断”字符的形式输入超过128个字符(我不知道该怎么做),或者使用字节流来代替它(我也不知道该怎么做)

有帮助吗?另外,请拧紧任何使用过时的不受支持的编码发布带有官方信息的文档的人。

0 个答案:

没有答案