获取“java.nio.charset.UnmappableCharacterException:输入长度= 1”

时间:2016-01-28 11:16:50

标签: java java-8

我在collect()方法调用(或toList()调用上)得到UnmappableCharacterException:

    private static void handleTransaction(Path a_filePath, String a_sTrasactionName, String a_sTransactionFilePath) {

    // read file into stream, try-with-resources
    try (Stream<String> stream = Files.lines(Paths.get(a_filePath.toString()), Charset.defaultCharset())) {

        List<String> list =
            stream.filter(line -> (line.indexOf(a_sTrasactionName) > 0))
            .collect(Collectors.toList());

        list.forEach(line -> {

            System.out.println(line);

            try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(_FILES_PATH + a_sTransactionFilePath),Charset.defaultCharset(), StandardOpenOption.APPEND)) {
                writer.write(line + "\n");
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    } catch (IOException e1) {

        e1.printStackTrace();
    }

它曾经为我工作过一次,但从那时起就没有。

我读过的文件是在solaris上创建的csv文件。我在Windows 2012服务器上运行jar

你能告诉我吗?

谢谢。

2 个答案:

答案 0 :(得分:5)

  

我读过的文件是在solaris上创建的csv文件。我在Windows 2012服务器上运行jar

那么那可能就是问题了。您正在使用platform-default编码来读取和写入文件。如果文件是在Solaris上创建的,那么很可能对Windows框具有不同的平台默认编码。

如果您知道正在阅读的文件的编码,请指定。

如果你控制你正在阅读和写作的文件的编码,我强烈建议使用UTF-8,除非你有充分的理由不这样做。

使用Charset.default()如果您正在阅读您知道的文件使用平台默认编码,或者您正在编写一个文件你肯定希望使用平台默认编码 - 并尽量避免使用后者。

(基本上,一切都以UTF-8编码的世界是一个更简单的世界......)

答案 1 :(得分:3)

老实说,我甚至不确定这是否是答案,但我想提供帮助。我遇到了同样的问题并使用了:

val source = io.Source.fromFile("C:/mon_usatotaldat.csv").codec.decodingReplaceWith("UTF-8")

我得到了输出:

  

来源:scala.io.Codec = windows-1252