正确地在while循环中使用BufferedReader.readLine()
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正确地在while循环中使用BufferedReader.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处停止。用户可能会运行带有任意行数的文件的程序,因此我当前的for循环实现赢得了'工作。
为什么线路while(br.readLine()!=null)
停在50?我检查了文本文件,没有任何东西可以挂起来。
当我使用while循环时,我没有从try-catch中得到任何错误,所以我很难过。有人有主意吗?
你在循环中第二次调用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);
}
如果你仍然在绊倒这个问题。现在Java 8的东西看起来更好:
try {
Files.lines(Paths.get(targetsFile)).forEach(
s -> {
System.out.println(s);
// do more stuff with s
}
);
} catch (IOException exc) {
exc.printStackTrace();
}
感谢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");
}
再次感谢!你们真棒!
Concept Solution:br.read() returns particular character's int value so loop
continue's until we won't get -1 as int value and Hence up to there it print
br.eadline() which returns a line into String form.
Way 1:
while(br.read()!=-1)
{
//continues loop until we won't get int value as a -1
System.out.println(br.readLine());
}
Way 2:
while((line=br.readLine())!=null)
{
System.out.println(line);
}
Way 3:
for(String line=br.readLine();line!=null;line=br.readLine())
{
System.out.println(line);
}``
Way 4:
It's an advance way to read file using collection and arrays concept
How we iterate using for each loop.
在这里查看http://www.java67.com/2016/01/how-to-use-foreach-method-in-java-8-examples.html
除了@ramin给出的答案,如果你已经有BufferedReader
或InputStream
,可以迭代这样的行:
reader.lines().forEach(line -> {
//...
});
或者如果您需要按给定的顺序处理它:
reader.lines().forEachOrdered(line -> {
//...
});
以上是关于正确地在while循环中使用BufferedReader.readLine()的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 中的另一个 while 循环中正确地创建一个 while 循环?
在 while 循环中正确使用 BufferedReader.readLine()