Scanner vs. BufferedReader

Até onde sei, os dois methods mais comuns de ler dados baseados em caracteres de um arquivo em Java são o uso do Scanner ou do BufferedReader . Eu também sei que o BufferedReader lê arquivos eficientemente usando um buffer para evitar operações de disco físico. Minhas perguntas são:

  • O Scanner funciona tão bem quanto o BufferedReader ?
  • Por que você escolheria o Scanner por BufferedReader ou vice-versa?

Scanner é usado para analisar os tokens do conteúdo do stream, enquanto o BufferedReader apenas lê o stream e não faz nenhuma análise especial.

Na verdade, você pode passar um BufferedReader para um scanner como a fonte de caracteres a analisar.

No release / build mais recente do JDK6 (b27), o Scanner tem um buffer menor ( 1024 caracteres ), ao contrário do BufferedReader ( 8192 caracteres ), mas é mais do que suficiente.

Quanto à escolha, use o Scanner se quiser analisar o arquivo, use o BufferedReader se quiser ler o arquivo linha por linha. Veja também o texto introdutório de suas documentações de API relacionadas anteriormente.

  • Parsing = interpretando a input dada como tokens (partes). É capaz de devolver partes específicas diretamente como int, string, decimal, etc. Veja também todos os methods nextXxx() na class Scanner .
  • Leitura = streaming mudo. Ele continua devolvendo a você todos os personagens, os quais você, por sua vez, terá que inspecionar manualmente se quiser combinar ou compor algo útil. Mas se você não precisa fazer isso de qualquer maneira, a leitura é suficiente.

Veja este link , a seguir é citado a partir daí:

Um BufferedReader é uma class simples destinada a ler com eficiência o stream subjacente. Geralmente, cada solicitação de leitura feita de um Reader como um FileReader faz com que uma solicitação de leitura correspondente seja feita para o stream subjacente. Cada chamada de read () ou readLine () pode fazer com que os bytes sejam lidos no arquivo, convertidos em caracteres e retornados, o que pode ser muito ineficiente. A eficiência é melhorada sensivelmente se um Reader for deformado em um BufferedReader.

O BufferedReader é sincronizado, portanto, as operações de leitura em um BufferedReader podem ser feitas com segurança a partir de vários encadeamentos.

Um scanner, por outro lado, tem muito mais queijo embutido; Ele pode fazer tudo o que um BufferedReader pode fazer e com o mesmo nível de eficiência também. No entanto, além disso, um Scanner pode analisar o stream subjacente para tipos e cadeias primitivos usando expressões regulares. Também pode tokenizar o stream subjacente com o delimitador de sua escolha. Ele também pode fazer varredura direta do stream subjacente, desconsiderando o delimitador!

Um scanner, no entanto, não é thread-safe, ele precisa ser sincronizado externamente.

A escolha de usar um BufferedReader ou um Scanner depende do código que você está escrevendo, se você estiver escrevendo um leitor de log simples O leitor Buffered é adequado. No entanto, se você estiver escrevendo um analisador XML, o Scanner será a opção mais natural.

Mesmo ao ler a input, se você quiser aceitar a input do usuário linha por linha e dizer apenas adicioná-lo a um arquivo, um BufferedReader é bom o suficiente. Por outro lado, se você quiser aceitar a input do usuário como um comando com várias opções e, em seguida, pretender executar operações diferentes com base no comando e nas opções especificadas, um Scanner será mais adequado.

  1. BufferedReader possui memory buffer significativamente maior que o Scanner. Use BufferedReader se desejar obter sequências longas de um stream e use o Scanner se desejar analisar um tipo específico de token de um stream.

  2. Scanner pode usar o tokenize usando o delimitador customizado e analisar o stream em tipos primitivos de dados, enquanto o BufferedReader pode apenas ler e armazenar o String.

  3. BufferedReader é síncrono, enquanto o Scanner não é. Use BufferedReader se você estiver trabalhando com vários threads.

  4. Scanner esconde IOException enquanto BufferedReader lança imediatamente.

Eu sugiro usar o BufferedReader para ler texto. Scanner esconde IOException enquanto BufferedReader lança imediatamente.

  • BufferedReader é síncrono, enquanto o Scanner não é.
  • BufferedReader deve ser usado se estivermos trabalhando com vários segmentos.
  • BufferedReader possui memory buffer significativamente maior que o Scanner .
  • O Scanner tem um pequeno buffer (1KB buffer de char) ao contrário do BufferedReader (buffer de byte de 8KB), mas é mais que suficiente.
  • BufferedReader é um pouco mais rápido em comparação com o Scanner porque o Scanner faz a análise dos dados de input e o BufferedReader simplesmente lê a seqüência de caracteres.

================================================== ======================

A class Scanner é o complemento da class Formater (usada para converter dados binários em texto formatado). O scanner lê a input formatada e a converte em sua forma binária. Embora sempre tenha sido possível ler a input formatada, era necessário mais esforço do que a maioria dos programadores preferiria. Por causa da adição do Scanner, agora é fácil ler todos os tipos de valores numéricos, strings e outros tipos de dados, sejam eles provenientes de um arquivo em disco, do teclado ou de outra origem. O scanner pode ser usado para ler a input do console, um arquivo, uma string ou qualquer outra fonte que implemente a interface legível ou ReadableByteChannel. Por exemplo, você pode usar o Scanner para ler um número do teclado e atribuir seu valor a uma variável.

BufferedReader , por outro lado, é uma class de E / S de stream de caracteres. Os streams de caracteres fornecem uma maneira conveniente de input e saída em termos de caracteres (Unicode). BufferedReader é usado principalmente para obter input do console, System.in . Leva um object InputStreamReader como um argumento.

As Principais Diferenças:

  1. Scanner

  • Um scanner de texto simples que pode analisar tipos primitivos e strings usando expressões regulares.
  • Um Scanner interrompe sua input em tokens usando um padrão delimitador, que, por padrão, corresponde ao espaço em branco. Os tokens resultantes podem então ser convertidos em valores de diferentes tipos usando os vários methods seguintes.

Exemplo

  String input = "1 fish 2 fish red fish blue fish"; Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*"); System.out.println(s.nextInt()); System.out.println(s.nextInt()); System.out.println(s.next()); System.out.println(s.next()); s.close(); 

imprime a seguinte saída:

  1 2 red blue 

A mesma saída pode ser gerada com esse código, que usa uma expressão regular para analisar todos os quatro tokens de uma só vez:

  String input = "1 fish 2 fish red fish blue fish"; Scanner s = new Scanner(input); s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)"); MatchResult result = s.match(); for (int i=1; i<=result.groupCount(); i++) System.out.println(result.group(i)); s.close(); ` 


  1. BufferedReader:

    • Lê o texto de um stream de input de caracteres, armazenando em buffer caracteres para fornecer leitura eficiente de caracteres, matrizes e linhas.

    • O tamanho do buffer pode ser especificado ou o tamanho padrão pode ser usado. O padrão é grande o suficiente para a maioria dos propósitos.

Em geral, cada solicitação de leitura feita de um Leitor faz com que uma solicitação de leitura correspondente seja feita do caractere subjacente ou do stream de bytes. Portanto, é aconselhável envolver um BufferedReader em qualquer Leitor cujas operações read () possam ser caras, como FileReaders e InputStreamReaders. Por exemplo,

 BufferedReader in = new BufferedReader(new FileReader("foo.in")); 

armazenará em buffer a input do arquivo especificado. Sem o armazenamento em buffer, cada chamada de read () ou readLine () poderia fazer com que os bytes fossem lidos no arquivo, convertidos em caracteres e retornados, o que pode ser muito ineficiente. Programas que usam DataInputStreams para input textual podem ser localizados substituindo cada DataInputStream por um BufferedReader apropriado.

Fonte: Link

A seguir estão as diferenças entre BufferedReader e Scanner

  1. O BufferedReader apenas lê dados, mas o analisador também analisa os dados.
  2. você só pode ler String usando BufferedReader, mas pode ler int, long ou float usando o Scanner.
  3. O BufferedReader é mais antigo do Scanner, ele existe no jdk 1.1 enquanto o Scanner foi adicionado no JDK 5.
  4. O tamanho do BufferedReader é grande (8KB) ​​em comparação com 1KB do Scanner.
  5. BufferedReader é mais adequado para a leitura de arquivos com longas seqüências de caracteres, enquanto o Scanner é mais adequado para a leitura de pequenas inputs do usuário a partir do prompt de comando.
  6. O BufferedReader é sincronizado, mas o Scanner não é, o que significa que você não pode compartilhar o Scanner entre vários encadeamentos.
  7. O BufferedReader é mais rápido que o Scanner porque não gasta tempo na análise
  8. O BufferedReader é um pouco mais rápido em comparação com o Scanner
  9. O BufferedReader é do pacote java.io e o Scanner é do pacote java.util com base nos pontos que podemos selecionar.

obrigado

A diferença entre o BufferedReader e o Scanner é a seguinte:

  1. O BufferedReader é sincronizado, mas o Scanner não está sincronizado .
  2. O BufferedReader é thread-safe, mas o Scanner não é thread-safe .
  3. O BufferedReader tem memory buffer maior, mas o Scanner tem memory buffer menor .
  4. O BufferedReader é mais rápido, mas o Scanner está mais lento na execução .
  5. Código para ler uma linha do console:

    BufferedReader :

      InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br= new BufferedReader(isr); String st= br.readLine(); 

    Scanner :

     Scanner sc= new Scanner(System.in); String st= sc.nextLine(); 

Existem diferentes maneiras de tomar input em java como:

1) BufferedReader 2) Scanner 3) Argumentos da linha de comando

BufferedReader Lê o texto de um stream de input de caracteres, armazenando em buffer caracteres para fornecer leitura eficiente de caracteres, matrizes e linhas.

Onde Scanner é um scanner de texto simples que pode analisar tipos primitivos e strings usando expressões regulares.

se você estiver escrevendo um simples leitor de log O leitor de buffer é adequado. Se você está escrevendo um analisador de XML, o Scanner é a escolha mais natural.

Para mais informações, por favor consulte:

http://java.meritcampus.com/t/240/Bufferedreader?tc=mm69

A resposta abaixo foi retirada de Reading from Console: JAVA Scanner vs BufferedReader

Quando ler uma input do console, existem duas opções para conseguir isso. Primeiro usando o Scanner , outro usando o BufferedReader . Ambos possuem características diferentes. Isso significa diferenças de como usá-lo.

O scanner tratou a input dada como token. BufferedReader apenas leu linha por linha, dado input como string. O próprio scanner fornece resources de análise como nextInt (), nextFloat ().

Mas, quais são as diferenças entre os outros?

  • O scanner tratou a input dada como token. BufferedReader como linha de stream / string
  • Scanner digitou a input dada usando regex. Usando BufferedReader deve escrever código extra
  • BufferedReader mais rápido que o scanner * ponto no. 2
  • O scanner não está sincronizado, o BufferedReader é sincronizado

Scanner vem com desde o JDK versão 1.5 superior.

Quando deve usar o Scanner ou o Buffered Reader?

Veja as principais diferenças entre os dois, um usando tokenized, outros usando stream line. Quando você precisar de resources de análise, use o Scanner. Mas estou mais confortável com o BufferedReader. Quando você precisa ler de um arquivo, use BufferedReader, porque é usar buffer quando ler um arquivo. Ou você pode usar o BufferedReader como input para o Scanner.

Listando alguns …

java.util.Scanner class java.util.Scanner é um scanner de texto simples que pode analisar tipos e cadeias de caracteres primitivos. Ele usa internamente expressões regulares para ler tipos diferentes.

Java.io.BufferedReader class Java.io.BufferedReader lê o texto de um stream de input de caracteres, armazenando em buffer os caracteres para fornecer uma leitura eficiente da seqüência de caracteres

1) O BufferedReader é síncrono enquanto o Scanner não está. BufferedReader deve ser usado se estivermos trabalhando com vários segmentos.

2) O BufferedReader possui memory buffer significativamente maior que o Scanner . O Scanner tem um pequeno buffer (1KB buffer de char) ao contrário do BufferedReader (buffer de byte de 8KB), mas é mais que suficiente.

3) O BufferedReader é um pouco mais rápido em comparação com o Scanner porque o Scanner faz a análise dos dados de input e o BufferedReader simplesmente lê a seqüência de caracteres.

  1. O BufferedReader provavelmente oferecerá melhor desempenho (porque o Scanner é baseado em InputStreamReader, fonts de aparência). ups, para ler arquivos, usa o nio. Quando testei o desempenho do nio em relação ao desempenho do BufferedReader para arquivos grandes, o nio mostra um desempenho um pouco melhor.
  2. Para ler o arquivo, tente o Apache Commons IO.

Eu prefiro o Scanner porque ele não lança exceções verificadas e, portanto, seu uso resulta em um código mais simplificado.