Runtime.getRuntime()+execução de bat

Bom dia

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.

[code] [color=blue] public void MoverArquivo(String nmOrigem , String nmDestino)throws Exception{
String nmOrigemA,nmDestinoA;
File nmBatMove ;
BufferedWriter bwLinha;

        nmOrigemA = nmOrigem.replace("\\\\", "\\");
        nmDestinoA = nmDestino.replace("\\\\","\\");
                                      

        
        nmBatMove = new File(nmOrigem.replace(" ","_")+".bat");
        
        bwLinha = new BufferedWriter(new FileWriter(nmOrigem.replace(" ","_")+".bat"));
        bwLinha.newLine();
        bwLinha.write("move /Y "+"\""+ nmOrigemA + "\" " +"\""+ nmDestinoA +"\"" );
        bwLinha.flush();
        bwLinha.close();                                    
        Runtime.getRuntime().exec(nmOrigem.replace(" ","_")+".bat");        
        
                 
  }[/color][/code]

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();
    }
}

Bom dia!

Para fazer cópias ou mover arquivos, sugiro o seguinte artigo (para não tirar os direitos autorais de quem fez): http://www.mundooo.com.br/php/modules.php?name=News&file=article&sid=3
Para manipular arquivos, tem um ótimo tutorial aqui que poderias adaptar:
http://www.guj.com.br/java.tutorial.artigo.13.1.guj

Sobre o bat, eu geralmente coloco “cmd /c start” mas o problema que ele abre uma janela em separado.

Se fores um pouco mais maníaco por performance na manipulação de arquivos em java, é muito bom ler sobre Java NIO.

Até mais!
Marcos

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.)

Muito Obrigada pelas respostas…

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.

Acho que vou ter que utilizar essa forma mesmo e depois eu apago o arquivo da origem.

Muito Obrigada a todos …

Luana (Lumargi)

[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.