如何在读取文件时跳过空行(java)?

时间:2015-06-22 15:29:08

标签: java string java.util.scanner filereader

我正在尝试读取此文件,然后将其放入List:

23333
Manuel Oliveira
19

222222
Mário Santos
18

使用扫描仪。 如果忽略19和222222之间的空行,我就是这样做的。

public List<Aluno> lerFicheiro ( String nomeF) throws FileNotFoundException{
    List<Aluno> pauta = new LinkedList<Aluno>();
try{
    Scanner s = new Scanner ( new File ( nomeF));
    int cont = 0;
    String numero = null;
    String nome = null;;
    String nota;
    while ( s.hasNextLine())
    {
        if ( cont ==0)
        {
             numero = s.nextLine();
        }
        else
        {  
          if ( cont == 1) 
             nome = s.nextLine();
          else
          {   
              if ( cont == 2) 
              {
                  nota = s.nextLine();
                  cont =-1;
                  pauta.add( new Aluno(Integer.valueOf(numero), nome, nota)); 
              }
           }
        }
        cont++;
    }
    s.close();
}
catch ( FileNotFoundException e)
{
    System.out.println(e.getMessage());
}
return pauta;
}

但我不知道如何用空行读它。 谢谢。

2 个答案:

答案 0 :(得分:1)

对于初学者来说,那里有一个基本状态机的良好开端。您可以通过两种方式考虑空行:

  1. 你对任何空行都不感兴趣。因此,您只需忽略它们,就不要更改cont
  2. 您对“nota”之后的空行不感兴趣。在这种情况下,您应该将其添加为第四个状态。
  3. 第一种方法的优点是,即使文件中有多个空行,或者名称后面有空行,也会被忽略。如果“nota”之后的其他空行有用,第二种方法会更好。

    我认为阅读该行会更优雅,然后根据cont决定如何处理它。所以对于第一种方法(忽略任何空行):

    while ( s.hasNextLine()){
    
        // First read
        String theLine = s.nextLine();
    
        // Ignore it if it's empty. That is, only do something if
        // the line is not empty
    
        if ( ! theLine.isEmpty() ) {
    
            if ( cont == 0){
                 numero = theLine; // You use the line you have read
            }else if ( cont == 1) {
                 nome = theLine;
            }else {
                 nota = theLine;
                 cont =-1;
                 pauta.add( new Aluno(Integer.valueOf(numero), nome, nota)); 
            }
    
            cont++;
        }
    
    }
    

    当您读取空行时,状态(cont)不会更改。所以就好像这条线从未存在过一样。

    请注意,使用常量而不仅仅是012会更好,这样它们才有意义。

    还要注意正确编写if...else if...else的方法。你不需要一直把它们放在花括号中。

答案 1 :(得分:0)

您可以将分隔符设置为表示一个或多个行分隔符的正则表达式,例如(\r?\n)+(或自Java 8 \R+以来),只需使用next()方法读取行。

顺便说一句:你不应该将close()放在try块内,而是放在finally块中。或者更好地使用try-with-resources。

因此,如果您确定该文件将始终包含来自3行的令牌构建,那么您的方法可能看起来像(为了简单起见,我将返回类型更改为List<String>,但您应该能够很容易地将其更改回来)

public static List<String> lerFicheiro(String nomeF)
        throws FileNotFoundException {

    List<String> pauta = new LinkedList<>();
    try (Scanner s = new Scanner(new File(nomeF))){
        s.useDelimiter("\\R+");

        while (s.hasNext()) {
            //since delimiter is line separator `next` will read lines
            String numero = s.next();
            String nome = s.next();
            String nota = s.next();
            pauta.add(numero + ":" + nome + ":" + nota);
        }
    } catch (FileNotFoundException e) {
        System.out.println(e.getMessage());
    }
    return pauta;
}