| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 12:45:21
|
rodrigo.bossini
GUJ Master
![[Avatar]](/images/avatar/3b6fe2dc98ceed6e1608e7cfc662ab11.jpg)
Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline
|
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:
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?
|
http://www.rodrigobossini.com.br/
Meu Twitter:@rodrigobossini Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo? |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 13:29:03
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
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.
|
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 14:58:41
|
rodrigo.bossini
GUJ Master
![[Avatar]](/images/avatar/3b6fe2dc98ceed6e1608e7cfc662ab11.jpg)
Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline
|
Existe alguma forma de fazer cópia de arquivo assincrona? Um método que transfere essa tarefa para o sistema operacional e retorna imediatamente?
|
http://www.rodrigobossini.com.br/
Meu Twitter:@rodrigobossini Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo? |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 16:03:46
|
rodrigo.bossini
GUJ Master
![[Avatar]](/images/avatar/3b6fe2dc98ceed6e1608e7cfc662ab11.jpg)
Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline
|
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 é?
|
http://www.rodrigobossini.com.br/
Meu Twitter:@rodrigobossini Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo? |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/06/2011 08:20:10
|
juceliohv
JavaTeenager
![[Avatar]](/images/avatar/42bda3b3e1b568fea3655161639b976e.jpg)
Membro desde: 26/08/2010 11:31:55
Mensagens: 178
Offline
|
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.
|
 |
|
|
 |
|
|