【问题标题】:Why my method don't read all of my File? ... Java?为什么我的方法没有读取我的所有文件? ... 爪哇?
【发布时间】:2016-10-03 01:07:01
【问题描述】:

我必须显示我的块(文本文件)中的所有记录,并进行拆分以“覆盖”字段分隔符,但只显示我的块的第一条记录。我做错了什么?

enter code here 
public static void listAllStudents() throws IOException {

    File path = new File(Descriptor.getBlockPath());

    for (int i = 0; i < path.listFiles().length; i++) {

        try {
            FileInputStream file = new FileInputStream(Descriptor.getBlockPath() + "BLK" + i + ".txt");
            InputStreamReader entrada = new InputStreamReader(file);
            BufferedReader buf= new BufferedReader(entrada);
            String piece = " ";

            System.out.println("\nBLOCO " + i + " ------------------------------------------------------ +");

            do {


                if (buf.ready()) {
                    piece = buf.readLine();
                    System.out.println("\n¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨");

                    String string = " ", field[] = piece.split(Descriptor.getFieldSeparator());
                    string = " ";

                    System.out.println("CPF: " + field[0]);
                    System.out.println("Name: " + field[1]);
                    System.out.println("Course: " + field[2]);
                    System.out.println("Age: " + field[3]);
                    System.out.println("Phone: " + field[4]);
                    System.out.println("Active: " + field[5]);

                    string = " ";
                }

            } while (buf.ready());

            buf.close();
        } catch (IOException e) {
            System.out.println();
        }
    }

}

【问题讨论】:

  • ready() 的经典误用。在任何时间或地点,它都不是流结束的有效测试。

标签: java file split


【解决方案1】:

请参阅BufferedReader.readLine() method 的文档:

如果已经到达流的末尾,则返回 null

然后更改代码以逐行读取文件:

while ((piece = buf.readLine()) != null) {
     String field[] = piece.split(Descriptor.getFieldSeparator());

     if (field.length >= 6) {
                System.out.println("CPF: " + field[0]);
                System.out.println("Name: " + field[1]);
                System.out.println("Course: " + field[2]);
                System.out.println("Age: " + field[3]);
                System.out.println("Phone: " + field[4]);
                System.out.println("Active: " + field[5]);
     }
}

【讨论】:

  • 您的链接只是告诉#ready 取决于阅读器实现,而 OP 代码回退到 FileInputStream#available(),这确实说明是否还有要阅读的内容。
  • 它说 如果保证下一个 read() 不会阻塞输入,则返回 true, - 这就是它的全部承诺
  • 是的,你是对的,让我们将我们的调查限制在 JavaDoc 上,它显然不能保证太多,因为这取决于使用的 Reader 实现。我们不应该研究 OP 实际使用的阅读器(和嵌套的输入流)。
  • @Tom 'Something available to be read without blocking' 与 'something left to read' 不同。 ready()available() 都不是流结束的有效测试,Javadoc 明确说明了这一点。
猜你喜欢
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
相关资源
最近更新 更多