【问题标题】:Unable to read txt file by line [duplicate]无法逐行读取txt文件[重复]
【发布时间】:2017-05-01 19:55:35
【问题描述】:

我尝试在每一行中读取一个 txt 文件(其中包含文本)。然后我将稍后处理这些行。

这是我的工作。

 import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class Fypio {

    public static void main(String args[]) {

        String fileName = "e://input.txt";

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

            stream.forEach(System.out::println);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

但是,我收到以下错误。不过,我确信目录是正确的。

错误:

Exception in thread "main" java.io.UncheckedIOException: java.nio.charset.MalformedInputException: Input length = 1
  at java.io.BufferedReader$1.hasNext(BufferedReader.java:574)
  at java.util.Iterator.forEachRemaining(Iterator.java:115)
  at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
  at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
  at fypio.Fypio.main(Fypio.java:21)
Caused by: java.nio.charset.MalformedInputException: Input length = 1
  at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
  at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
  at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
  at java.io.InputStreamReader.read(InputStreamReader.java:184)
  at java.io.BufferedReader.fill(BufferedReader.java:161)
  at java.io.BufferedReader.readLine(BufferedReader.java:324)
  at java.io.BufferedReader.readLine(BufferedReader.java:389)
  at java.io.BufferedReader$1.hasNext(BufferedReader.java:571)
  ... 4 more

#或者可以提供任何示例代码来逐行读取txt文件?

更新我的txt文件应该用ANSI编码

【问题讨论】:

    标签: java file-io nio


    【解决方案1】:

    MalformedInputException 表示您的文本文件不在您请求的charset(编码)中。

    虽然您的代码没有明确指定字符集,但Files.lines method always uses UTF-8:

    从文件中读取所有行作为Stream。使用UTF-8 charset 将文件中的字节解码为字符。

    由于您的文本文件不是 UTF-8 文本文件,因此您需要在代码中使用 specify its charset。如果您不确定,该文件可能使用系统的默认字符集:

    try (Stream<String> stream = Files.lines(Paths.get(fileName), Charset.defaultCharset())) {
    

    更新:

    您在评论中声明您的文本文件是“ANSI”,这是 Windows 用于其单字节字符集的(技术上不正确的)名称。在美国版本的 Windows 上,您可能希望使用:

    try (Stream<String> stream = Files.lines(Paths.get(fileName), Charset.forName("windows-1252"))) {
    

    【讨论】:

    • 我的 txt 应该用 ANSI 编码。但是您的代码不起作用
    • 您是否遇到同样的异常?
    • 是......
    • 答案已更新。尝试使用与 Windows 所谓的“ANSI”相对应的显式字符集。
    猜你喜欢
    • 2017-08-29
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2015-05-19
    • 2020-02-21
    • 1970-01-01
    相关资源
    最近更新 更多