Java - 麻烦读取text.file

时间:2011-11-04 20:21:56

标签: java text-files

我创建了一个用Java读取文件的方法。有问题的文件包含一系列具有以下格式的书籍:lastname | firstname | title。但是,当我尝试使用该方法时,我收到一条错误消息。我的方法如下:

private final static char END_SIGN = '|';

void readBookFile(String readFile) {
        try {
            FileReader textFileReader = new FileReader(readFile);
            BufferedReader textReader = new BufferedReader(textFileReader);

            int numberOfBooks = Integer.parseInt(textReader.readLine());

            for (int i = 0; i < numberOfBooks; i++) {
                String post = textReader.readLine();

                int index1 = post.indexOf(END_SIGN);
                int index2 = post.indexOf(END_SIGN, index1 + 1);

                String lastname = post.substring(0, index1);
                String firstname = post.substring(index1 + 1, index2);
                String title = post.substring(index2 + 1);

                Book book = new Book(lastname, firstname, title);

                addBook(book);
            }

            tekstReader.close();
        }
        catch (IOException exception) {
            System.out.print("Wrong file reading: " + exception);
            System.exit(1);
        }
    }

当我尝试运行此方法时,我收到错误消息:

Exception in thread "main" java.lang.NumberFormatException: For input string: "Twain|Mark|The Adventures of Huckleberry Finn"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at Library.readBookFile(Library.java:36)
    at LibraryTest.main(LibraryTest.java:8)

第36行是我识别整数numberOfBooks的方法的一部分。所以显然这不是出于某种原因。如果有人知道什么可能导致这种情况,我将非常感激!

8 个答案:

答案 0 :(得分:5)

int numberOfBooks = Integer.parseInt(textReader.readLine());

readLine()此处返回文本文件第一行的文本。第一行似乎是Twain|Mark|The Adventures of Huckleberry Finn,而不是文件中有多少本书。

你期望文件的第一行是什么?

答案 1 :(得分:4)

显然,文件的第一行不是一个数字 - 它是错误消息中显示的行。你需要检查你的文件。

其他一些注意事项:

  • 您通常应该在finally区块
  • 中关闭您的阅读器
  • 您几乎从不使用平台默认编码,这是FileReader支持的所有编码,使其成为一种无用的类型。而是创建一个FileInputStream并将其包装在InputStreamReader中,指定编码。

Guava使用Files类:

使所有这些变得更容易
List<String> lines = Files.readLines(new File(readFile), Charsets.UTF_8);
// All the IO is now done...

答案 2 :(得分:4)

您正在阅读的行不是数字。这是一本书的名称,所以当它试图将其作为数字读取时,它会给出错误。当您查看输入文件时,您确定它以要跟随的行数开头吗?

答案 3 :(得分:3)

而不是这段代码:

int numberOfBooks = Integer.parseInt(textReader.readLine());

for (int i = 0; i < numberOfBooks; i++) {
    String post = textReader.readLine();

    int index1 = post.indexOf(END_SIGN);
    int index2 = post.indexOf(END_SIGN, index1 + 1);

    String lastname = post.substring(0, index1);
    String firstname = post.substring(index1 + 1, index2);
    String title = post.substring(index2 + 1);

    Book book = new Book(lastname, firstname, title);

    addBook(book);
}

试试这个:

String post = textReader.readLine();
while (post != null) {
    int index1 = post.indexOf(END_SIGN);
    int index2 = post.indexOf(END_SIGN, index1 + 1);

    String lastname = post.substring(0, index1);
    String firstname = post.substring(index1 + 1, index2);
    String title = post.substring(index2 + 1);

    Book book = new Book(lastname, firstname, title);

    addBook(book);
    post = textReader.readLine();
}

此外,就像Jon Skeet建议的那样,您应该重新安排代码以确保即使输入处理引发异常也会关闭输入。 (try ... finally构造对此有好处。)

答案 4 :(得分:2)

代码假设文件以整数开头,书籍数量单独在第一行。显然,这不存在于您的数据文件中。

答案 5 :(得分:2)

错误已经说明了:你不能用字符串创建一个整数:“吐温|马克|哈克贝利芬恩历险记”:这不是数字表达。

答案 6 :(得分:1)

int numberOfBooks = Integer.parseInt(textReader.readLine());

textReader.readLine()返回的行(String)不是数字,因为它返回:

"Twain|Mark|The Adventures of Huckleberry Finn"

答案 7 :(得分:1)

鉴于“有问题的文件包含具有以下格式的书籍列表:姓氏|名字|标题。”

在for循环之前尝试int numberOfBooks = Integer.parseInt(textReader.readLine());时会抛出异常,因为它无法转换|将字符串分隔为整数。

假设每行1本书,书籍数量就是总行数......