Teste Desempenho IO Buffered vs FileChannel - Continuação

4 respostas
rodrigo.bossini

Realize alguns testes de cópia de arquivo para comparar as classes de java.io e java.nio. Vejam aqui.

Agora realizei um novo teste, usando o método renameTo:

new File ("D:\\origemRename\\testePerformance.txt").renameTo(new File ("D:\\destinoRename\\testePerformance.txt"));

Me espantei ao ver que o tempo para execução desta linha foi 0. Independente do tamanho do arquivo. Creio que, diferentemente dos métodos usando FileChannel e Buffered reader/writer que criei no teste anterior, este método simplesmente delega a atividade de copiar o arquivo para o gerenciador de IO do SO, e volta instantaneamente depois disso.

Só tem um detalhe: Desta forma, o arquivo não é copiado, e sim movido. Alguém tem alguma sugestão para usar este método e fazê-lo copiar o arquivo
em vez de movê-lo?

4 Respostas

T

renameTo, no Windows, envolve o uso da API MoveFile (que é chamada pela rotina rename da biblioteca-padrão do C), que faz uma das seguintes coisas:

a) Se ambos os parâmetros (origem e destino) estão na mesma partição, apenas efetua a transferência do arquivo de um diretório para outro;

b) Se estiverem em partições diferentes (ou até máquinas diferentes, no caso de arquivos localizados em drives compartilhados), então realmente copia o arquivo, da melhor maneira possível para o Windows, e então remove o arquivo original.

No caso a) o tempo será próximo a zero, embora, conforme você e eu saibamos, não existe nada que seja executado em tempo zero em informática (a menos que tal coisa simplesmente não seja executada).

No caso b), depende apenas das condições de rede e/ou disco.

rodrigo.bossini

Existe alguma forma de fazer cópia de arquivo assincrona? Um método que transfere essa tarefa para o sistema operacional e retorna imediatamente?

rodrigo.bossini

E outra, eu utilizo FileChannel para copiar meus arquivos. Sempre pensei que essa fosse a maneira mais rápida de fazer isso.
Seja na mesma partição ou não, o FileChannel demora sempre mais que o renameTo. Alguém explica porque?
Se esta não é a maneira mais rápida de copiar um arquivo usando java, então qual é?

juceliohv

Bom dia,

Quando você renomeia o local do arquivo, na verdade você está movendo o arquivo de diretório, mas não está movendo fisicamente o arquivo no HD. O ato de mover ou renomear para outro diretório é apenas uma troca de reverência do arquivo e não do local real dele no HD.

Experimente o seguinte. No windows, apenas pegue um arquivo e mova-o para outro diretório. Será bem mais rápido que copiá-lo.

A cópia de arquivo é mais lenta por que não trabalha somente com referência. Ela carrega fisicamente ou duplica o conteúdo do arquivo na memória principal(RAM) e salva em um novo arquivo em outro lugar. Embora tenham o mesmo nome e conteúdo, são arquivos diferentes e em locais diferentes.

Uma coisa é mover o arquivo (apenas referencia), outra coisa é copiar o arquivo (carrega na memória).

Espero que tenha ajudado.

Abraço.

Criado 15 de janeiro de 2010
Ultima resposta 14 de jun. de 2011
Respostas 4
Participantes 3