【问题标题】:textfile line reader- java文本文件行阅读器 - java
【发布时间】:2015-11-11 17:54:48
【问题描述】:
    ArrayList <Integer> referenceNom = new ArrayList <Integer>();
    ArrayList <String> bookTitle = new ArrayList <String>();
    BufferedReader br = null;

    try {
        br = new BufferedReader(new FileReader("Booklist.txt"));
        while ((br.readLine()) != null ){
            for (int count = 1; count <= 44; count++){
                if (count % 2 == 1){
                    referenceNom.add(Integer.parseInt(br.readLine()));
                    System.out.print(referenceNom.get(count));
                }else {
                    bookTitle.add(br.readLine());
                    System.out.print(bookTitle.get(count));
                }
            }                                     
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            br.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

我正在尝试创建一个读取文本文件行的阅读器,在本例中为“Booklist.txt”。问题是我不断收到 java.lang.NumberFormatException 错误。文本文件由 44 行组成,第一行是数字,第二行是书名,第三行是数字,依此类推。我试图创建一个阅读器来检查行号是偶数还是奇数,并根据它将该行文本添加到整数数组列表或字符串数​​组列表中。数字的整数数组列表和书名的字符串数组列表。此外,我还尝试通过创建一个计数器来跟踪行号,每次读取一行时计数加 1。

非常感谢任何帮助,在此先感谢。

【问题讨论】:

  • } else if (count == 1); { 是错误的。您可以删除条件并使用else
  • 编辑了那部分谢谢
  • 不要使用 if 和 else if 语句,只需让 BufferedReader 读取一行,然后立即读取第二行。这会将你的 for 循环代码减少到 2 行代码。

标签: java arraylist text-files bufferedreader


【解决方案1】:

你“扔掉”第一行。因此,您首先获得第一个标题,而不是第一个数字。您应该只使用 1 个循环,而不是 while 循环和 for 循环:

String line;
while ((line = br.readLine()) != null ){
    referenceNom.add(Integer.parseInt(line));
    bookTitle.add(br.readLine());                 
}

for (int count = 1; count <= 44; count++){
     if (count % 2 == 1){
         referenceNom.add(Integer.parseInt(br.readLine()));
     } else {
         bookTitle.add(br.readLine());
     }
 }

应该可以。

【讨论】:

  • 是的,我尝试了第一个代码并且成功了。您是如何创建 String 行的?我不能像使用 br.readLine() 一样将字符串添加到 bookTitle 吗?
  • @JeffreyCaoWatsYourPowerLvl:我以为你想保留这些数字。每次调用readLine 都会读取不同的行。如果您不将返回值分配给变量,您将丢失该信息。您需要将结果存储在一个变量中,因为您想对结果做两件事:a) 检查null 以确定是否到达文件末尾 b) 解析该行并将结果添加到列表中.
  • 是的,我确实想保留这些数字,只是想了解您为什么这样做:)。我的意思是如何添加到 referenceNom 你做了 .add(line) 但对于 bookTitle 你做了 .add(br.readLine)。 bookTitle.add(line) 不起作用吗?
  • @JeffreyCaoWatsYourPowerLvl:line 始终包含带有数字的行。如果存在带数字的行,则对于正确的输入文件,会出现带有标题的行。如果在数字行之后到达文件末尾,则无需再次检查。因此readLine 调用的返回值直接传递给列表的add 方法。 (while 循环在同一迭代中读取两行。)
【解决方案2】:
int count = 0;
String line = null;
while (line = (br.readLine() != null)) {
    if (count % 2 == 0) {
        referenceNom.add(Integer.parseInt(line));
    } else {
        bookTitle.add(line);
    }
    count++;
}

如果有什么不清楚的地方请告诉我。

【讨论】:

    【解决方案3】:

    首先,将读取的行存储在一个变量中

    String line=br.readLine();
    

    然后你可以使用 Try-Cach 来识别值的种类,所以你的代码可能是这样的:

    String line=null;
    while ((line=br.readLine()) != null ){
             try{
                  referenceNom.add(Integer.parseInt(line));
                  System.out.print(referenceNom.get(count));
             }catch(java.lang.NumberFormatException e){
                 bookTitle.add(line);
                 System.out.print(bookTitle.get(count));
            }catch(Exception e){
                //Unexpected Exception
                e.printStackTrace();
            }                                     
        }
    

    像这样,行数可能多于或少于 44 行,您无需更改代码

    【讨论】:

    • 这与@fabian 描述的问题相同。您丢弃了 while 循环条件中的第一行。
    • 对不起,我忘了更改 Integer.pasreInt 的粘贴代码...@ReubenSanders
    • 在while循环条件下问题依然存在:(br.readLine()) != null
    • 我觉得自己像个菜鸟......对不起@ReubenSanders
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多