如何在Java / Scala中跳过流中的无效字符?

2022-09-02 11:44:15

例如,我有以下代码

Source.fromFile(new File( path), "UTF-8").getLines()

并引发异常

Exception in thread "main" java.nio.charset.MalformedInputException: Input length = 1
    at java.nio.charset.CoderResult.throwException(CoderResult.java:260)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:319)

我不在乎某些行是否未被读取,但是如何跳过无效的字符并继续读取行?


答案 1

您可以通过调用 CharsetDecoder.onMalformedInput 来影响字符集解码处理无效输入的方式。

通常,您永远不会直接看到对象,因为它将在幕后为您创建。因此,如果您需要访问它,则需要使用允许您直接指定(而不仅仅是编码名称或)的API。CharsetDecoderCharsetDecoderCharset

这种API最基本的例子是InputStreamReader

InputStream in = ...;
CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder();
decoder.onMalformedInput(CodingErrorAction.IGNORE);
Reader reader = new InputStreamReader(in, decoder);

请注意,此代码使用Java 7类StandardCharsets,对于早期版本,您可以简单地将其替换为Charset.forName(“UTF-8”)(或使用Guava中的Charsets)。


答案 2

好吧,如果它不是UTF-8,那就是别的东西。诀窍是找出其他东西是什么,但是如果您想要的只是避免错误,则可以使用没有无效代码的编码,例如:latin1

Source.fromFile(new File( path), "latin1").getLines()

推荐