Duvida quanto a InputStream

11 respostas
Arthur.hvt
int i = System.in.read();
System.out.println(i);

Porque quando eu coloco um valor pelo teclado e aperto enter, a variavel i recebe um valor e é impresso se o metodo read() da classe InputStream é abstrato???

e porque se eu colocar varios caracteres ele só ira pegar o valor do primeiro???

11 Respostas

gabrielmassote

tem readLine?

von.juliano

Porque quando você acessa System.in você está acessando uma implementação da classe InputStream (um BufferedInputStream, se não me engano), que implementa esse método.

Porque o método read() lê o primeiro byte na entrada de dados.

Blz? Flw! :thumbup:

Foxlol

von.juliano:
Porque quando você acessa System.in você está acessando uma implementação da classe InputStream (um BufferedInputStream, se não me engano), que implementa esse método.

Porque o método read() lê o primeiro byte na entrada de dados.

Blz? Flw! :thumbup:

Exatamente!

Arthur.hvt

Como ele sabe que tem que chamar o metodo read() da classe BufferedInputStream? É porque a entrada é pelo teclado?

Porque nao é necessario encadear fluxos nesse caso?

B

Ele não “sabe”, foi feito desse modo.

System.in é um InputStream. read() é um dos métodos de um InputStream, portanto dá pra usar.

E como assim encadear fluxo?

Arthur.hvt

tipo, read() da classe InputStream é abstrato e nao tem corpo. O von.juliano disse que ele chama o read() da classe BufferedInputStream. Não estou entendendo como ele “sabe” que tem que chamar o BufferedInputStream se a in é uma referencia de InputStream.

Quando se escreve um arquivo, se usa:

BufferedWriter b = new BufferedWriter(new FileWriter(new File("arquivo.txt")));

Nesse caso, esta se encadeando um File a um FileWriter, que esta se encadeando a um BufferedWriter, certo?

Se a classe chamada é BufferedInputStream, por que nao preciso encadear essa classe à InputStream nesse caso?

Foxlol

Arthur.hvt:
tipo, read() da classe InputStream é abstrato e nao tem corpo. O von.juliano disse que ele chama o read() da classe BufferedInputStream. Não estou entendendo como ele “sabe” que tem que chamar o BufferedInputStream se a in é uma referencia de InputStream.

Quando se escreve um arquivo, se usa:

BufferedWriter b = new BufferedWriter(new FileWriter(new File("arquivo.txt")));

Nesse caso, esta se encadeando um File a um FileWriter, que esta se encadeando a um BufferedWriter, certo?

Se a classe chamada é BufferedInputStream, por que nao preciso encadear essa classe à InputStream nesse caso?

Simples, eh o chamado polimorfismo!

Na classe System existe um atributo InpuStream que recebe uma instância de BufferedInputStream, ou outra subclasse, dependendo da situação.
Exemplo:

InputStream in = new BufferedInputStream();

Já que BufferedInputStream extende indiretamente InputStream. Ou seja, é filha de InputStream.

Se vc ver o código fonte da classe System vai entender melhor.

Flw.

Arthur.hvt

Hum… acho que começo a entender…

Agora a duvida é de como ele sabe que é de BufferedInputStream. É por causa da entrada ser pelo teclado? A classe usada para entrada de um arquivo é FileInputStream, e nesse caso eu precisaria fazer:

FileInputStream a = new FileInputStream(new File("arquivo.txt"));  //encadeamento!!

Porque no caso de BufferedInputStream nao precisa se fazer isso?

von.juliano

Arthur.hvt:
Hum… acho que começo a entender…

Agora a duvida é de como ele sabe que é de BufferedInputStream. É por causa da entrada ser pelo teclado? A classe usada para entrada de um arquivo é FileInputStream, e nesse caso eu precisaria fazer:

FileInputStream a = new FileInputStream(new File("arquivo.txt"));  //encadeamento!!

Porque no caso de BufferedInputStream nao precisa se fazer isso?


Você está confundindo um pouco as coisas. O System.in (a chamada entrada de dados padrão, normalmente o teclado) instancia um BufferedInputStream para ler os dados, mas poderia ser um DataInputStream por exemplo, mas não é você que lida com isso, é a classe System.

Agora se você quiser ler os dados à partir do System.in você pode fazer

new DataInputStream(System.in); // ou new BufferedInputStream(System.in);Assim você tem um Data/BufferedInputStream com entrada de dados vinda da “entrada padrão”.

Blz? Flw! :thumbup:

Foxlol

Arthur.hvt:
Hum… acho que começo a entender…

Agora a duvida é de como ele sabe que é de BufferedInputStream. É por causa da entrada ser pelo teclado? A classe usada para entrada de um arquivo é FileInputStream, e nesse caso eu precisaria fazer:

FileInputStream a = new FileInputStream(new File("arquivo.txt"));  //encadeamento!!

Porque no caso de BufferedInputStream nao precisa se fazer isso?

Esta decisão é tomada pela implementação da classe System.
Dê uma olhada no código fonte dela e vc entenderá.

Flw

Arthur.hvt

sim sim… entendi.

Pensava antes que a referencia apontava para um objeto InputStream… Entao voce me falou que era pra um BufferedInputStream.

Só que ainda estava pensando que o objeto mudava para cada tipo diferente de entrada. Agora vi que é a implementaçao mesmo de System

Obrigado a todos :thumbup:

Criado 2 de junho de 2008
Ultima resposta 5 de jun. de 2008
Respostas 11
Participantes 5