[英]Using BufferedReader.readLine() in a while loop properly
所以我在将文本文件读入我的程序时遇到了问题。 这是代码:
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 中得到任何错误,所以我被难住了。 谁有想法?
也很全面...
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");
}
您在循环内第二次调用br.readLine()
。
因此,您每次四处走动时最终都会阅读两行。
您可以使用如下结构:
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");
}
再次感谢! 你们太棒了!
概念解决方案:br.read() 返回特定字符的 int 值,因此循环继续,直到我们不会得到 -1 作为 int 值,因此直到那里它打印 br.readLine() 它将一行返回为 String 形式。
//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);
}
方式 4:这是一种使用集合和数组概念读取文件的高级方法我们如何使用 for 每个循环进行迭代。 在这里检查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 -> {
//...
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.