Galera, alguém pode me dizer como eu faço para pegar um arquivo genérico e passar ele via Socket e por ele passar os seus bytes para o outro lado…
Eu vi que as classes que herdam InputStream possuem o método avaliable que retorna um int, mas eu queria mesmo é um método para retornar um array de bytes e assim colocar dentro de um looping e passar via socket…
Se alguém tiver outra sugestão para resolver o problema, ok
Olá ivandasilva!
Eu ainda desconheço um método que retorne um array de bytes.
mas vc pode fazer assim:
Usar a classe FileInputStream.read(byte[] b) para ler os bytes e FileOutStream.read(byte[] b) para escrever os bytes.
O método read(byte[] b) retorna um número inteiro para informar a quantidade de bytes lidos. Quando o arquivo termina, ele retorna -1.
Esse array de bytes do método read() é o array que vai ser preenchido com os bytes lidos.
Eu ainda não vi os links que você postou, pode ter certeza que eu vou ver, mas a minha dúvida é como eu vou pegar os bytes do arquivo para transferência, porque eu posso definir um array de bytes mas como a subclasse de InputStream vai saber de qual arquivo que é.Por exemplo se é um PDF ou um TXT...
Não sei se entendeu minha dúvida mas é isto.
Na verdade o problema nem era o Socket eu estava confuso quanto o uso dos métodos read(byte[] b) e write(byte[] b)…
Bom para efetuar a leitura(sem uso de socket) eu fiz assim…
File file = new File("C:/Sun/AppServer/License_Notice_Translated.pdf");
FileInputStream fis = new FileInputStream(file);
int size = fis.available();
byte[] up = new byte[size];
fis.read(up);
file = new File("c:/users/irodrigues/Desktop/arquivo.pdf");
FileOutputStream fos = new FileOutputStream(file);
fos.write(up);
Vc deve usar o modelo do evangeliment por vc não tem garantia que todos os bytes serão lidos ao mesmo tempo no cliente, logo vc tem que ir montando o seu arquivo com um pooling, como ele demostrou.
ovelha, eu não consegui enchergar o pooling, no exemplo dele ele define um número mágico 1400. Na verdade eu não vi o pooling que você falou e não consegui enchergar o perigo de enviar via socket um arquivo.
Não existe perigo em mandar arquivo via socket, o perigo é programar o socket de forma errada.
Até ler um arquivo do disco da forma que vc implementou não é a adequada, quem dira pegar um arquivo de um socket.
Quando vc faz um InputStream.read, vc não tem a garantia que todos os bytes serão lidos naquele momento, nem mesmo a garantia que seu numero magico será o numero de bytes lidos.
Pode ser que na primeira InputStream.read venham apenas 500b, por isso nosso amigo entanglement resaltou a importancia de pegar o numero de bytes recebidos.
Em outras palavras, o pooling (for) vai garantir que seu arquivo venha inteiro (pode ser que vc tenha que dar 20 InputStream.read), e pegar o numero de bytes recebidos garante que vc não vai escrever lixo no seu arquivo. (já que pode vir apenas 500 unidades e todo o resto do array seria lixo)
Isso vale tanto para sockets quanto para IO comum.