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

dus*_*kin 3 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();
    }
Run Code Online (Sandbox Code Playgroud)

它对我有用,但从那时起从未如此.

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

你能告诉我吗?

谢谢.

Jon*_*eet 5

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

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

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

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

只有使用Charset.default()如果你正在读你一个文件知道使用平台的默认编码,或者如果你正在写,你绝对是一个文件使用平台的默认编码-并尽量避免后者.

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

  • @dushkin:目前还不清楚你的意思.基本上,文件只是一个字节序列.任何能够创建文件的东西都可以创建它想要的任何序列.我们不知道创建输入文件的内容是什么......你应该开始考虑它. (2认同)