segunda-feira, 13 de agosto de 2012

Aprenda a mover, copiar e apagar arquivos utilizando o Java

Programando em Java, podemos ter que manipular arquivos físicos, tais como: criar, mover, copiar, apagar.
Para mover e renomear arquivos basta usar com método renameTo() da classe File.
Para copiar é um pouco mais complexo, para facilitar segue abaixo dois métodos copy() que executam essa tarefa de forma diferente. Coloquei um print no log para analisar a velocidade da execução e o segundo copy foi mais eficiente. Mas ambos funcionam, faça seus testes.
O primeiro método é mais tradicional e mais estável, portanto mais usado no dia-à-dia.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.channels.FileChannel;
import java.util.Date;


public class ManipularArquivos {

    public static void main(String[] args){
      
        String pathExemploOrigem = "C:/Imagem/Koala.jpg";
        String pathExemploDestinoCopiar = "C:/Imagem/Copy1/Koala.jpg";
        String pathExemploDestinoCopiar2 = "C:/Imagem/Copy2/Koala.jpg";
        String pathExemploDestinoRenomear = "C:/Imagem/Copy/Coala.jpg";
      
        File arquivoExemploOrigem = new File(pathExemploOrigem);
        File arquivoExemploDestinoCopiar = new File(pathExemploDestinoCopiar);
        File arquivoExemploDestinoCopiar2 = new File(pathExemploDestinoCopiar2);
        File arquivoExemploDestinoRenomear = new File(pathExemploDestinoRenomear);
      
        try {
          
            //Primeiro modo de copiar o arquivo de um local para outro
            copy(arquivoExemploOrigem, arquivoExemploDestinoCopiar);
          
            //Segundo modo de copiar o arquivo de um local para outro
            copy(arquivoExemploOrigem, arquivoExemploDestinoCopiar2, true);
          
            //Renomear ou mover um arquivo
            //Se não alterar a pasta, o sistema apenas renomeia
            //Se alterar a pasta, o sistema move o arquivo e renomeia
            arquivoExemploDestinoCopiar.renameTo(arquivoExemploDestinoRenomear);
          
            //Apagar um arquivo
            arquivoExemploDestinoCopiar2.delete();
          
        } catch (IOException e) {
            e.printStackTrace();
        }
      
    }
  
    /**
     * Copia arquivos de um local para o outro
     * @param origem - Arquivo de origem
     * @param destino - Arquivo de destino
     * @param overwrite - Confirmação para sobrescrever os arquivos
     * @throws IOException
     */
    public static void copy(File origem, File destino) throws IOException {
        Date date = new Date();
        InputStream in = new FileInputStream(origem);
        OutputStream out = new FileOutputStream(destino);          
        // Transferindo bytes de entrada para saída
        byte[] buffer = new byte[1024];
        int lenght;
        while ((lenght= in.read(buffer)) > 0) {
            out.write(buffer, 0, lenght);
        }
        in.close();
        out.close();
        Long time = new Date().getTime() - date.getTime();
        System.out.println("Saiu copy"+time);
    }
  
    /**
     * Copia arquivos de um local para o outro
     * @param origem - Arquivo de origem
     * @param destino - Arquivo de destino
     * @param overwrite - Confirmação para sobrescrever os arquivos
     * @throws IOException
     */
    public static void copy(File origem, File destino, boolean overwrite) throws IOException{
        Date date = new Date();
       if (destino.exists() && !overwrite){
          System.err.println(destino.getName()+" já existe, ignorando...");
          return;
       }
       FileInputStream fisOrigem = new FileInputStream(origem);
       FileOutputStream fisDestino = new FileOutputStream(destino);
       FileChannel fcOrigem = fisOrigem.getChannel();  
       FileChannel fcDestino = fisDestino.getChannel();  
       fcOrigem.transferTo(0, fcOrigem.size(), fcDestino);  
       fisOrigem.close();  
       fisDestino.close();
       Long time = new Date().getTime() - date.getTime();
       System.out.println("Saiu copy"+time);
    }
}

4 comentários:

  1. e se eu quiser copiar TODOS os arquivos de uma pasta de uma so vez, tentei o *.jpg e nao deu certo e tambem sem nome de arquivo, alguma ideia?

    ResponderExcluir
  2. Muto bom o exemplo!

    Muito obrigado!

    ResponderExcluir