ler um arquivo usando Scanner: Por que estou recebendo um erro ao usar o scanner para ler arquivos em java?

StackOverflow https://stackoverflow.com/questions/766846

  •  12-09-2019
  •  | 
  •  

Pergunta

Este exemplo demonstra o uso do scanner para ler um arquivo linha por linha (não executar uma operação de gravação) Eu não sei por que eu recebo um erro quando eu tento compilar. Alguém poderia explicar a razão para mim ?. Estou usando jcreatorLE e JDK 1.6 para executar o meu programa:

import java.io.*;
import java.util.Scanner;

public final class File_read {

  public static void main(String... aArgs) throws FileNotFoundException {
    ReadWithScanner parser = new ReadWithScanner("C:\\Temp\\test.txt");
    parser.processLineByLine();
    log("Done.");
  }

  /**
  * @param aFileName full name of an existing, readable file.
  */
  public ReadWithScanner(String aFileName){
    fFile = new File(aFileName);  
  }

  /** Template method that calls {@link #processLine(String)}.  */
  public final void processLineByLine() throws FileNotFoundException {
    Scanner scanner = new Scanner(fFile);
    try {
      //first use a Scanner to get each line
      while ( scanner.hasNextLine() ){
        processLine( scanner.nextLine() );
      }
    }
    finally {
      //ensure the underlying stream is always closed
      scanner.close();
    }
  }

  /** 
  * Overridable method for processing lines in different ways.
  *  
  * <P>This simple default implementation expects simple name-value pairs, separated by an 
  * '=' sign. Examples of valid input : 
  * <tt>height = 167cm</tt>
  * <tt>mass =  65kg</tt>
  * <tt>disposition =  "grumpy"</tt>
  * <tt>this is the name = this is the value</tt>
  */
  protected void processLine(String aLine){
    //use a second Scanner to parse the content of each line 
    Scanner scanner = new Scanner(aLine);
    scanner.useDelimiter("=");
    if ( scanner.hasNext() ){
      String name = scanner.next();
      String value = scanner.next();
      log("Name is : " + quote(name.trim()) + ", and Value is : " + quote(value.trim()) );
    }
    else {
      log("Empty or invalid line. Unable to process.");
    }
    //(no need for finally here, since String is source)
    scanner.close();
  }

  // PRIVATE //
  private final File fFile;

  private static void log(Object aObject){
    System.out.println(String.valueOf(aObject));
  }

  private String quote(String aText){
    String QUOTE = "'";
    return QUOTE + aText + QUOTE;
  }
} 

Este é o resultado de executá-lo:

--------------------Configuration: <Default>--------------------
C:\Users\administrador\Documents\File_read.java:15: invalid method declaration; return type required
  public ReadWithScanner(String aFileName){
         ^
1 error

Process completed.
Foi útil?

Solução

Quando você levantou que o código de aqui :-), você renomeou a classe, mas não o construtor. Apenas construtores estão autorizados a não têm tipos de retorno.

Eu sugiro que você quer mudar o nome da volta classe ou mudar o nome do construtor.

Espero que isso não é lição de casa. Tal como está, o educador teria um tempo de prova plágio fácil. Você vai precisar de pelo menos alterar os nomes de variáveis, bem como nomes de classe, você pode querer também reformatá-lo um pouco, incluindo alterar a ordem dos métodos na classe.

Isto é, se a sua lição de casa. Que não é, certo? : -)

Outras dicas

Seu "ReadWithScanner" necessidades do construtor para coincidir com o nome da classe ( "file_read")

public File_read(String aFileName){
    fFile = new File(aFileName);  
}

Sua classe é nomeado File_read e seu construtor é chamado ReadWithScanner. A advertência é que suas necessidades do construtor a ser o mesmo nome que a classe.

O nome da classe é file_read, por isso o nome do construtor deve ser file_read mas você deu o nome como ReadWithScanner é por isso que a sua queixa. Compiler pensando seu nome de um método tão esperando um tipo de retorno.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top