【问题标题】:Java BufferedReader to String ArrayJava BufferedReader 到字符串数组
【发布时间】:2014-10-11 18:38:33
【问题描述】:

我在 stackoverflow 上浏览了很多不同的主题,但到目前为止找不到任何有用的东西:/

所以这是我的问题。我正在写一个文件复印机。问题在读取文件时已经出现。我的测试文档有 3 行随机文本。所有这 3 行都应该写在一个字符串数组中。问题是只有文本文档的第二行被写入数组,我不知道为什么。已经调试过了,但没有让我进一步了解。

我知道对于具有不同类等的文件复印机有不同的解决方案。但我真的很想让它与我在这里使用的类一起运行。

    String[] array = new String[5];
    String datei = "test.txt";
    public String[] readfile() throws FileNotFoundException {
    FileReader fr = new FileReader(datei);
    BufferedReader bf = new BufferedReader(fr);
    try {
        int i=0;
        //String  Zeile = bf.readLine();
        while(bf.readLine() != null){
            array[i] = bf.readLine();
        //  System.out.println(array[i]);  This line is for testing
            i++;
        }
        bf.close();

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

【问题讨论】:

    标签: java arrays while-loop filereader filewriter


    【解决方案1】:

    您为循环的每次迭代调用了两次readLine(),从而丢弃了其他每一行。您需要捕获每个 调用readLine() 返回的值,因为每个readLine() 调用都会提高读者在文件中的位置。

    这是idiomatic 解决方案:

    String line;
    while((line = bf.readLine()) != null){
        array[i] = line;
        i++;
    }
    

    【讨论】:

    • 感谢您提供的超快速且非常有帮助的答案!现在一切正常。如果我有任何声誉,会投票并标记为最佳答案。
    • 通过接受答案,您确实做到了:),如果您真的觉得自己也需要投票,您可以稍后在有足够的代表时回来。
    【解决方案2】:

    这里你读到 2 行:

       while(bf.readLine() != null){
            array[i] = bf.readLine();
        //  System.out.println(array[i]);  This line is for testing
            i++;
        }
    

    您必须将代码更改为:

       String line = null;
       while((line =bf.readLine()) != null){
            array[i] = line;
        //  System.out.println(array[i]);  This line is for testing
            i++;
        }
    

    【讨论】:

      【解决方案3】:

      问题就在这里:

      while(bf.readLine() != null)
      

      readLine() 读取一行并在移动到下一行的同时返回。

      因此,不仅要检查返回的值是否为null,还要存储它。

      String txt = null;
      while((txt = bf.readLine()) != null)
          array[i++] = txt;
      

      【讨论】:

      • 它没有给我测试文件的 3 行,而是给了我 3 行,上面写着“null”。问题已经解决了,但我想尽可能多地学习。如果我们也能让您的解决方案发挥作用,我们会很高兴。
      【解决方案4】:

      我认为是因为您调用了 readLine() 两次。第一次在循环中,然后第二次将其放入数组中。因此,它在循环的开头读取一行(第 1 行),然后读取循环内的第一行代码(您看到的第 2 行)

      【讨论】:

        【解决方案5】:

        我正在使用 Stream。

        不是。此表单仅适用于读取文本文件。

        BufferedReader bf = new BufferedReader(fr);
        // ...
        List<String> lines = bf.lines().collect(Collectors.toList());
        

        【讨论】:

          猜你喜欢
          • 2016-01-02
          • 2013-01-08
          • 2013-05-31
          • 1970-01-01
          • 2013-05-28
          • 2018-08-10
          • 2012-04-20
          • 1970-01-01
          • 2014-04-18
          相关资源
          最近更新 更多