Estamos trabalhando no projeto e nesta fase , nossa aplicação vai tratar arquivos de 10mb até 3 Gb e
existe um momento após todo o tratamento onde é necessário mover o arquivo para outro diretório .
Estou tentado utilizar a rotina abaixo para mover os arquivos através de um .bat que é executado pelo método “Runtime.getRuntime().”
no entanto todo o tratamento do arquivo e inclusive a execução do BAT está em thread.
Problema: Não está funcionando direito …as vezes executa e as vezes não executa, no entanto se eu executar o arquivo .bat
direto no diretório funciona perfeitamente, portanto , o bat não foi construído com erro de sintaxe.
Por que preciso do arquivo bat : porque o comando move é muito mais rápido que o copy e não sei como executar o move diretamente no Java.
Alguém sabe ou tem outra idéia ?
A minha suspeita é que a execução é mais rápida do que a construção do arquivo bat…Acho que o programa chega até a rotina de execução do bat antes de ter finalizado de escrever e fechar o arquivo.
a) Se os arquivos estão em diretórios diferentes, mas no mesmo disco (exemplo: ambos os diretórios estão no disco C:, ou ambos estão no disco D: ), você pode usar File.renameTo para “mover” o arquivo.
b) Se os arquivos estão em diretórios diferentes e em partições diferentes você pode fazer a cópia com código Java, mas de modo bastante otimizado (porque o Java usa indiretamente as APIs do sistema operacional que fazem a cópia de modo mais rápido possível). Um exemplo vai abaixo.
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
class TestCopy {
public static void main(String[] args) throws Exception {
File fIn = new File (args[0]);
File fOut = new File (args[1]);
FileInputStream fis = new FileInputStream (fIn);
FileOutputStream fos = new FileOutputStream (fOut);
FileChannel fcIn = fis.getChannel();
FileChannel fcOut = fos.getChannel();
fcOut.transferFrom (fcIn, 0, fIn.length());
fos.close();
fis.close();
}
}
O artigo citado na MundoOO mostra como copiar arquivos jogando tudo na memória. Como ele tem arquivos com 3GB ele não pode usar o programa do artigo sem modificações.
(Nunca testei meu programa com arquivos de 3GB, mas como ele usa NIO usa alguns truques do sistema operacional que minimizam a quantidade de memória necessária.)
[quote=Lumargi]Utilizei o NIO e funcionou , apesar de estar incomodada com o fato que realiza uma cópia e não um move(igual ao DOS) , no entanto , é muito rápido.
[/quote]
O move do DOS (e do Windows Explorer) faz o seguinte:
Se a origem e o destino estiverem em diretórios no mesmo disco, efetua um “rename” no arquivo, tal como o File.renameTo.
Se a origem e destino estiverem em diretórios em discos diferentes, copia primeiro, e depois apaga.