java.nio.charset.MalformedInputException:输入长度=1

java.nio.charset.MalformedInputException: Input length = 1

我有这个(剥离了代码示例的 HTML 标签)从 CSV 构建 HTML table 的函数,但我得到了 运行每次我尝试 运行 时都会出现时间错误,但我不知道为什么。 Google 说编码可能有问题,但我不知道如何更改它。

我的 CSV 是用 ANSI 编码的,包含 ä、Ä、Ü、Ö 等字符,但我无法控制编码,也无法控制它是否会在未来发生变化。

这里出现错误:

Caused by: java.io.UncheckedIOException: java.nio.charset.MalformedInputException: Input length = 1
at java.io.BufferedReader.hasNext(Unknown Source)
at java.util.Iterator.forEachRemaining(Unknown Source)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source)
at java.util.stream.ReferencePipeline$Head.forEach(Unknown Source)
at testgui.Csv2Html.start(Csv2Html.java:121)

第 121 行是

lines.forEach(line -> {

源代码:

protected void start() throws Exception {

    Path path = Paths.get(inputFile);

    FileOutputStream fos = new FileOutputStream(outputFile, true);
    PrintStream ps = new PrintStream(fos);      

    boolean withTableHeader = (inputFile.length() != 0);
    try  {
        Stream<String> lines = Files.lines(path);
        lines.forEach(line -> {
            try {
                String[] columns = line.split(";");
                for (int i=0; i<columns.length; i++) {
                    columns[i] = escapeHTMLChars(columns[i]);
                }       
                if (withTableHeader == true && firstLine == true) {
                    tableHeader(ps, columns);
                    firstLine = false;
                } else {
                    tableRow(ps, columns);
                }


            } catch (Exception e) {
                e.printStackTrace();
            } finally {

            }
        });

    } finally {
        ps.close();
    }

}

您可以尝试使用 Files.lines(Path path, Charset charset) 形式的 lines 方法 (javadocs) 来使用正确的编码。

Here's a list of supported encodings (for the Oracle JVM anyhow). This post表示"Cp1252"是WindowsANSI。