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???
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
Bruno_Laturner
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.
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.
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:
InputStreamin=newBufferedInputStream();
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:
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:
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: