Transferencia de arquivos usando NIO, como passar os nomes e bytes dos arquivos juntos?

6 respostas
G

Oi galera, estou testando algumas funcionalidades, do NIO, e

estou com uma dúvida. Estou fazendo uma transferencia de um conjunto de arquivos utilizando NIO, por meio de canais, com os métodos

transferto e transferfrom. É um total de 100 arquivos. A transferencia está funcionando normalmente e bem rápido, pssando os bytes de cada arquivo.

No entanto os nomes dos arquivos nao sao passados e gostaria de saber se existe alguma possibilidade de passa-los para o cliente, um array contendo todos os

arquivo,s com seus nomes e bytes, de uma so vez.

Já que atualmente transfiro arquivo por arquivo, atraves do canal do arquivo.

Ou caso mandasse os nomes antes e os bytes de cada arquivo depois como poderia fazer isso, de forma n- bloqueante, ou seria apenas bloqueante (e caso seja somente assim como faria pelo menor tempo possivel) ?

Se puder me ajudar, muito obrigado.

6 Respostas

dudaskank

Hmm, você quando pega o canal ele não vem de um FileOutputStream certo? Se for, é só criar o arquivo com o nome que você quer…

algo como:

FileOutputStream destinoStream = new FileOutputStream(nomeDoArquivo);
FileChannel destino = destinoStream.getChannel();

ou eu perdi alguma coisa?

flw

G

Me respodenram… algo que pode me ajudar. Eu gostaria de tranasferir usando NIO um array de uma classe que representa uma estrutura de arquivos, ou seja , uma classe que tenha o nome e o array de bytes do arquivo. Mas como faço para transferir esta estrutura por um canal !? , pois quando serializo não descobrir como faço para pegar o canal, (Pois se fosse um objeto File teria o metodo getChannel() ), e transferir de uma máquina a outra. !!!

Obrigado pela ajuda.

T

uma ideia eh transformar os nomes de arquivos em bytes (String.getBytes()) e mandá-los para o outro lado. Nao se esqueça de usar o mesmo charset para nao ter problemas

G

Tem como passar um array de objetos (a classe define um nome do file e um array de bytes), por meio de channel para o outra maquina. como faria ?

Obrigado ae galera !

T

vc pode serializar para um ByteArrayOutputStream, mandar o array de bytes obtido e depois capturar do outro lado…
porem recomendo vc mandar o nome como string mesmo que eh mais simples

G

valeu pela dica… obrigado… Mas voces sabem me dizer se tem como passar pelo canal usando NIO, o nome e o array de bytes de um arquivo, de uma so vez ? E caso fosse mandar o conjunto de strings que representa os arquivos primeiro e depois o cojunto de arrays de bytes representando os arquivos, destes nomes que foram passados, ao passar primeiramente so os nomes dos arquivos como poderia fazer um envio destes nomes bloqueantes ?! o NIO permite, apesar de ser nao bloqueante ??

Pois quando mando primeiro os nomes dos arquivos, o servidor escreve no canal e logo depois sobrescreve os nomes com o array de bytes antes que o cliente tenha lido os nomes dos arquivos o código ta assim:

==> Servidor envia os nomes dos arquivos.
sc.write(encoder.encode(CharBuffer.wrap(nomes)));

==> Servidor envia o array de bytes de um arquivo

fis = new FileInputStream(file);

fchannel = fis.getChannel();

fchannel.transferTo(0, fchannel.size(), sc);
==> O cliente ao tentar ler do canal, a segunda parte do servidor sobrescreveu, o nome dos arquivos e entao tenho problemas.

dbuf.clear();

sc.read(dbuf);

dbuf.flip();

==> gera uma exceção pois tenta decodificar uma array de bytes

cb = decoder.decode(dbuf);

como bloqueio o servidor ate o cliente receber primeiramente o nome dos arquivos ??

Obrigado

Criado 18 de agosto de 2006
Ultima resposta 23 de ago. de 2006
Respostas 6
Participantes 3