在Java中如何检查文件中的下一条记录是否结束?

时间:2015-03-19 12:39:24

标签: java eof

我希望将输入未排序文件的每一行顺序读入数组的连续元素,直到没有更多记录为止 文件或直到达到输入大小,以先发生者为准。但如果文件的结尾,我无法想出检查下一行的方法吗?

这是我的代码:

 Scanner cin = new Scanner(System.in);
    System.out.print("Max number of items: ");
    int max = cin.nextInt();

    String[] input = new String[max];

    try {
        BufferedReader br = new BufferedReader(new FileReader("src/ioc.txt"));
        for(int i=0; i<max; i++){ //to do:check for empty record
            input[i] = br.readLine();
        }
    }
    catch (IOException e){
        System.out.print(e.getMessage());
    }

    for(int i=0; i<input.length; i++){
        System.out.println((i+1)+" "+input[i]);
    }

文件有205行,如果我输入210作为最大值,则数组打印出五个空元素,如此...

..204 Seychelles
205 Algeria
206 null
207 null
208 null
209 null
210 null

感谢您的回复!

6 个答案:

答案 0 :(得分:2)

来自the docs

  

public String readLine()

     

返回:包含行内容的String,不包括   任何行终止字符,如果流的末尾有,则返回null   已达成

换句话说,你应该做

String aux = br.readLine();
if(aux == null)
   break;
input.add(aux)

我建议您使用可变大小的数组(如果合理,您可以预先分配所请求的大小)。这样您就可以获得预期的大小或实际的行数,并可以稍后检查。

(取决于您的文件有多长,您也可以查看readAllLines()。)

答案 1 :(得分:1)

请参考此Number of lines in a file in Java并修改您的for循环,以获取输入的最大值或文件中的no.of行中的最小值。

答案 2 :(得分:1)

尝试:

for(int i=0; i<max; i++){ //to do:check for empty record
   if(br.readLine()!=null)
      input[i] = br.readLine();
   else
      break;
}

答案 3 :(得分:1)

使用List<String>

List<String> lines = new ArrayList<>(); // Growing array.
try (BufferedReader br = new BufferedReader(new FileReader("src/ioc.txt"))) {
    for(;;) {
        String line = br.readLine();
        if (line == null) {
            break;
        }
        lines.add(line);
    }
} catch (IOException e) {
    System.out.print(e.getMessage());
} // Closes automatically.

// If lines wanted as array:
String[] input = lines.toArray(new String[lines.size()]);

使用动态增长的ArrayList是解决此类问题的常用方法。

P.S。

FileReader将读取当前平台编码,即本地创建的本地文件。

答案 4 :(得分:1)

您可以在第一个for循环中执行空检查,如:

public static void main(String[] args) {
    Scanner cin = new Scanner(System.in);
    System.out.print("Max number of items: ");
    int max = cin.nextInt();

    BufferedReader br = new BufferedReader(new FileReader("src/ioc.txt"));
    List<String> input = new ArrayList<>();

    String nextString;
    int i;
    for (i = 0; i < max && ((nextString = br.readline()) != null); i++) {
        input.add(nextString);
    }

    for (int j = 0; j < i; j++) {
        System.out.println((j + 1) + " " + input.get(j));
    }
}

答案 5 :(得分:0)

    int i=0;
    for(; i<max; i++){ //to do:check for empty record
        String line=br.readLine();
        if(line==null){
            break;
        }
        input[i] = line;
    }
    //i will contain the count of lines read. indexes 0...(i-1) represent the data.