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

5 respostas
L

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.

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

5 Respostas

T

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

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

T

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

L

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)

T

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.

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.
Criado 1 de setembro de 2006
Ultima resposta 1 de set. de 2006
Respostas 5
Participantes 3