我希望将输入未排序文件的每一行顺序读入数组的连续元素,直到没有更多记录为止 文件或直到达到输入大小,以先发生者为准。但如果文件的结尾,我无法想出检查下一行的方法吗?
这是我的代码:
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
感谢您的回复!
答案 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.