Ответ 1
Вы вызываете br.readLine()
второй раз в цикле.
Поэтому вы заканчиваете чтение двух строк каждый раз, когда вы идете вокруг.
Итак, у меня возникла проблема с чтением текстового файла в моей программе. Вот код:
try{
InputStream fis=new FileInputStream(targetsFile);
BufferedReader br=new BufferedReader(new InputStreamReader(fis));
//while(br.readLine()!=null){
for(int i=0;i<100;i++){
String[] words=br.readLine().split(" ");
int targetX=Integer.parseInt(words[0]);
int targetY=Integer.parseInt(words[1]);
int targetW=Integer.parseInt(words[2]);
int targetH=Integer.parseInt(words[3]);
int targetHits=Integer.parseInt(words[4]);
Target a=new Target(targetX, targetY, targetW, targetH, targetHits);
targets.add(a);
}
br.close();
}
catch(Exception e){
System.err.println("Error: Target File Cannot Be Read");
}
Файл, который я читаю, содержит 100 строк аргументов. Если я использую цикл for, он работает отлично. Если я использую оператор while (тот, который прокомментирован выше цикла for), он останавливается на 50. Существует вероятность, что пользователь может запустить программу с файлом, который имеет любое количество строк, поэтому моя текущая реализация цикла завершилась ' т работы.
Почему линия while(br.readLine()!=null)
останавливается на 50? Я проверил текстовый файл, и нет ничего, что могло бы повесить его.
Я не получаю никаких ошибок из try-catch, когда я использую цикл while, поэтому я в тупике. У кого-нибудь есть идеи?
Вы вызываете br.readLine()
второй раз в цикле.
Поэтому вы заканчиваете чтение двух строк каждый раз, когда вы идете вокруг.
также очень всеобъемлющий...
try{
InputStream fis=new FileInputStream(targetsFile);
BufferedReader br=new BufferedReader(new InputStreamReader(fis));
for (String line = br.readLine(); line != null; line = br.readLine()) {
System.out.println(line);
}
br.close();
}
catch(Exception e){
System.err.println("Error: Target File Cannot Be Read");
}
Вы можете использовать следующую структуру:
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
Спасибо SLaks и jpm за помощь. Это была довольно простая ошибка, которую я просто не видел.
Как указывал SLaks, команда br.readLine() вызывалась дважды в каждом цикле, что заставляло программу получать только половину значений. Вот фиксированный код:
try{
InputStream fis=new FileInputStream(targetsFile);
BufferedReader br=new BufferedReader(new InputStreamReader(fis));
String words[]=new String[5];
String line=null;
while((line=br.readLine())!=null){
words=line.split(" ");
int targetX=Integer.parseInt(words[0]);
int targetY=Integer.parseInt(words[1]);
int targetW=Integer.parseInt(words[2]);
int targetH=Integer.parseInt(words[3]);
int targetHits=Integer.parseInt(words[4]);
Target a=new Target(targetX, targetY, targetW, targetH, targetHits);
targets.add(a);
}
br.close();
}
catch(Exception e){
System.err.println("Error: Target File Cannot Be Read");
}
Еще раз спасибо! Вы, ребята, великолепны!
Если вы все еще спотыкаетесь над этим вопросом. В настоящее время все выглядит лучше с Java 8:
try {
Files.lines(Paths.get(targetsFile)).forEach(
s -> {
System.out.println(s);
// do more stuff with s
}
);
} catch (IOException exc) {
exc.printStackTrace();
}