使用BufferedReader跳过第一行

26
我正在使用以下的bufferedreader来读取一个文件中的行。
BufferedReader reader = new BufferedReader(new FileReader(somepath));
while ((line1 = reader.readLine()) != null) 
{
    //some code
}

现在,我想跳过文件的第一行阅读,而且不想使用计数器int lineno来计算行数。

如何实现?


为什么不使用readLine并忽略它呢? - Sotirios Delimanolis
14
在循环之前调用 reader.readLine() - Andrew Logvinov
1
可能是跳过读取文本文件的第一行的重复问题。 - Brian Roach
@AndrewLogvinov 谢谢!我已经使用了你的方法,似乎是最有效的方式,请将其发布为答案。 - Code
6个回答

65

你可以尝试这个

 BufferedReader reader = new BufferedReader(new FileReader(somepath));
 reader.readLine(); // this will read the first line
 String line1=null;
 while ((line1 = reader.readLine()) != null){ //loop will run from 2nd line
        //some code
 }

简单易懂。我怎么没想到呢?:D - cristianoms
1
我现在感觉好傻 :D - mark ortiz

12

您可以使用Stream skip()函数,如下所示:

BufferedReader reader = new BufferedReader(new FileReader(somepath));   
Stream<String> lines = reader.lines().skip(1);

lines.forEachOrdered(line -> {

...
});

2
虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - Dharman
2
这个很完美。 - Sukh
值得一提的是,这个解决方案不会触发像SonaQube这样的代码分析软件中的错误,而选择的解决方案会抛出一个bug错误。 - JrBenito
@JrBenito 选定的错误可以通过 try (BufferedReader reader = new BufferedReader(new FileReader(somepath))) { ..... code } 解决,不是什么大问题。 - Al-Mothafar

5
File file = new File("path to file");
FileInputStream fis = new FileInputStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String line = null;
int count = 0;
while((line = br.readLine()) != null) { // read through file line by line
    if(count != 0) { // count == 0 means the first line
        System.out.println("That's not the first line");
    }
    count++; // count increments as you read lines
}
br.close(); // do not forget to close the resources

在你的代码中添加注释可以帮助用户更好地理解你的代码。 - shrmn
希望我的代码现在更清晰了,有了注释。谢谢你的提醒 ;) - user3743369

2
请使用LinenumberReader代替。
LineNumberReader reader = new LineNumberReader(new InputStreamReader(file.getInputStream()));
            String line1;
            while ((line1 = reader.readLine()) != null) 
            {
                if(reader.getLineNumber()==1){
                    continue;
                }
                System.out.println(line1);
            }

2
这可能是解决这个问题最低效和过于复杂的方式。 - Brian Roach
@BrianRoach 你认为LineNumberReader为什么过于复杂? - Hirak
1
因为 A)这不是必要的,B)每次读取都会进行不必要的比较。 - Brian Roach
1
A) 它让你有控制权,可以跳过任何你想要的行。不仅限于第一行。B) 我在问题中没有看到任何与性能问题相关的评论。我希望用户一定会自定义解决方案,而不是复制粘贴它。实际上,这里甚至不需要使用InputStreamReader,fileReader就可以了。我们是不是太主观了? - Hirak
3
我的个人观点是,既然你只需要一架双翼飞机,为什么要建造航天飞机呢?如果你想跳过文件的第一行,使用BufferedReader,在循环之前调用readLine()即可。完成了。 - Brian Roach

1
你可以创建一个计数器,其中包含起始行的值:
private final static START_LINE = 1;

BufferedReader reader = new BufferedReader(new FileReader(somepath));
int counter=START_LINE;

while ((line1 = reader.readLine()) != null) {
  if(counter>START_LINE){
     //your code here
  }
  counter++;
}

0
你可以这样做:
BufferedReader buf = new BufferedReader(new FileReader(fileName));
            String line = null;
            String[] wordsArray;
            boolean skipFirstLine = true;


while(true){
                line = buf.readLine();
                if ( skipFirstLine){ // skip data header
                    skipFirstLine = false; continue;
                }
                if(line == null){  
                    break; 
                }else{
                    wordsArray = line.split("\t");
}
buf.close();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接