Classe Scanner

Qual a diferença entre :

Scanner input = new Scanner(System.in);

e

BufferedReader x ;
x = new BufferedReader(new InputStreamReader(System.in))

Bom dia flavio, com relação ao Scanner input não sei te dizer, mas quando você usa o BufferedReader você consegui ler uma linha inteira digitada pelo usuário…

x.readLine();

[]'s

Com o Scanner você também consegue ler a linha inteira… Além de outros tipos de dados, como int, double, etc.

Algumas diferenças:

  1. A classe Scanner só existe a partir do Java 5, e é mais simples de usar;
  2. A classe Scanner usa como terminador de linha não só um \r\n mas qualquer expressão regular que você quiser;
  3. A classe Scanner serve para outras funções, especialmente se associada outros streams além do System.in.

so para completar o que os colegas ai falou… a class Scanner ela serve para entrada de dados via teclado… veja:

import java.util.Scanner;
class Sca{
public static void main(String[]rar){

Scanner dados = new Scanner(System.in);
System.out.println("Digite um numero ");
//lendo o numero
int num = dados.nextInt();

System.out.println("o numero digitado " + num);
}

e a BufferedReader --> vc ler arquivo serializados… nao sei ti falar direito… mais acredito que seja isso…

1 curtida

BufferedReader é pra qualquer leitura utilizando buffer… Seja arquivo em disco, pacotes na rede , serialização e etc…
Já o scanner se nao me engano é especifico pra teclado

Se engana sim. Você pode usar o scanner para analisar qualquer tipo de input stream, inclusive arquivos, sockets, etc. Como ele busca por uma expressão regular, fica muito fácil manipular coisas que não sejam apenas o teclado…

Valeu vini… tava justamente procurando esse topico pra reportar meu erro. Estava dando uma revisada no scanner e vi que me enganei … valeu

Bem, teste aqui as duas utilizações e percebi o seguinte:

BufferedReader x = new BufferedReader(new InputStreamReader(System.in));
String entrada = x.readLine();
System.out.println(entrada);

Todo o texto digitado como entrada no código acima, indenpendente de haver espaços, números, Strings e outros caracteres, será impresso.

Scanner input = new Scanner(System.in);
System.out.println("Entre com um número: ");
int num = input.nextInt();
System.out.println("Você digitou: "+num);

Neste caso, se houver inteiros misturados com Strings, espaços, caracteres, etc., exceções serão lançadas.

Resumindo: no meu caso, utilizar BufferedReader… foi muito mais fácil e eficaz.

[ ]

oq acontece se vc tentar receber um int do BufferedReader escrevendo junto Strings??

Pessoal,

estava fazendo alguns testes de performance lendo arquivos utilizando:

BufferedReader arquivo = new BufferedReader(new FileReader("p2.in"));

e

Scanner sc = new Scanner(new File("p2.in"));

e utilizar BufferedReader se mostrou ser bem mais eficaz. Rodando o mesmo algoritmo os tempos foram:

Scanner: 2,031 ms
BufferedReader: 0,391 ms

Alguém sabe pq de toda essa diferença?
Como esse código é pra competições do estilo “Maratona da Programação”, essa diferença de tempo causa um “Time Limit exceed”. Ou seja, o programa é considerado errado.

Obrigado.

Não é o Scanner que é problemático, é o BufferedReader que é mais rápido.

Se você passar um BufferedReader ao construtor de Scanner ( veja no Javadoc ) , em vez de passar um mero File, vai ver que seu benchmark vai ficar mais rápido.

[quote=thingol]Não é o Scanner que é problemático, é o BufferedReader que é mais rápido.

Se você passar um BufferedReader ao construtor de Scanner ( veja no Javadoc ) , em vez de passar um mero File, vai ver que seu benchmark vai ficar mais rápido.
[/quote]

Fala Thingol,

eu fiz a alteração que você sugeriu:

Scanner sc = new Scanner(new BufferedReader(new FileReader("p2.in")));

mas a performance do Scanner continua beeeeeem inferior a se usar apenas o BufferedReader.

Tempo: 2,062 ms

[quote]Fala Thingol,

eu fiz a alteração que você sugeriu:

view plaincopy to clipboardprint?
Scanner sc = new Scanner(new BufferedReader(new FileReader(“p2.in”)));
Scanner sc = new Scanner(new BufferedReader(new FileReader(“p2.in”)));

mas a performance do Scanner continua beeeeeem inferior a se usar apenas o BufferedReader.

Tempo: 2,062 ms

[/quote]

sim porque vc colocou dentro do scanner tenta

BufferedReader br = new BufferedReader(new FileReader("p2.in"));