Copiar arquivo para outro diretório

23 respostas
Ermin

Galera, tenho um arquivo .sql em um determinado diretório e queria pegar esse arquivo e copiá-lo para outro diretório.
Como isso ficaria em Java?

23 Respostas

thiago.correa

Ctrl + C e Ctrl + V não te serve?! :lol:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;






public class Teste {
	public static void main(String[] args) throws IOException {
		File arquivoOrigem = new File("c:/temp/original.txt");
		FileReader fis = new FileReader(arquivoOrigem);
		BufferedReader bufferedReader = new BufferedReader(fis);
		StringBuilder buffer = new StringBuilder();
		String line = "";
		while ((line = bufferedReader.readLine()) != null) {
			buffer.append(line).append("\n");			
		}
		
		fis.close();
		bufferedReader.close();
		
		File arquivoDestino = new File("C:/temp/copia.txt");
		FileWriter writer = new FileWriter(arquivoDestino);
		writer.write(buffer.toString());
		writer.flush();
		writer.close();
		
		
		
		
	}
}
ViniGodoy
Melhor ainda é copiar usando o FileChannel:
public static void copyFile(File source, File destination) throws IOException {
        if (destination.exists())
            destination.delete();

        FileChannel sourceChannel = null;
        FileChannel destinationChannel = null;

        try {
            sourceChannel = new FileInputStream(source).getChannel();
            destinationChannel = new FileOutputStream(destination).getChannel();
            sourceChannel.transferTo(0, sourceChannel.size(),
                    destinationChannel);
        } finally {
            if (sourceChannel != null && sourceChannel.isOpen())
                sourceChannel.close();
            if (destinationChannel != null && destinationChannel.isOpen())
                destinationChannel.close();
       }
   }
Ermin

Eu usuei seu método Thiago, mais olha só: fiz uns testes copiando documentos de texto e observei que ao copiar
o arquivo para outro diretório acontece uma substituição do conteúdo do arquivo como palavras acentuadas são
substituidas por símbolos. Estou implementando esse método para copiar arquivos .sql para usar em um BACKUP, isso pode levar
a uma inconsistência nos dados e até corromper o Banco de Dados não?

e Viny se vc puder me dar uma opinião agradeço!

E

Ermin, use o método do ViniGodoy. Ele não altera os arquivos.

Ermin

Estou tentando usar o do Viny, só q estou copiando os arquivos baseados na String URL de onde o arquivo está e para onde ele vai ser copiado. O problema é q não estou conseguindo transformar essas strings de endereços em tipo File que é o tipo exigido como parâmetro no método do Viny!
Alguma sugestão?
Abraço!

E
File f = new File ("C:\\diretorio\\arquivo.txt"); // Windows

ou

File f = new File ("/home/joselito/arquivo.txt"); // Linux, Unix, MacOSX
Ermin

Prontinho entanglement consegui fazer o método de copia, só tem um último probleminha: ao copiar o arquivo para outro diretório, se já existir um arquivo lá com o mesmo nome não faz a subsituição! Como poderia fazer essa subsituição, tipo sobrescrever o arquivo!

Vlw pela ajuda!

A
ViniGodoy:
Melhor ainda é copiar usando o FileChannel:
public static void copyFile(File source, File destination) throws IOException {
        if (destination.exists())
            destination.delete();

        FileChannel sourceChannel = null;
        FileChannel destinationChannel = null;

        try {
            sourceChannel = new FileInputStream(source).getChannel();
            destinationChannel = new FileOutputStream(destination).getChannel();
            sourceChannel.transferTo(0, sourceChannel.size(),
                    destinationChannel);
        } finally {
            if (sourceChannel != null && sourceChannel.isOpen())
                sourceChannel.close();
            if (destinationChannel != null && destinationChannel.isOpen())
                destinationChannel.close();
       }
   }

Oi Viny, esse método salvou minha vida! rs...

Abração,

dper

Ola ViniGodoy, estou iniciando os estudos em java, poderia me dar um exemplo de uso do seu metódo utilizando o caminho de referência dos arquivos que serão copiados obtidos em um TXT?No caso, seria realizada a leitura de um arquivo TXT com o caminho dos arquivos e o destino da cópia seria fixo. Obrigado.

pgioseffi

Prezado Erwin,

Ermin:
Prontinho entanglement consegui fazer o método de copia, só tem um último probleminha: ao copiar o arquivo para outro diretório, se já existir um arquivo lá com o mesmo nome não faz a subsituição! Como poderia fazer essa subsituição, tipo sobrescrever o arquivo!

Vlw pela ajuda!

O método copyFile já faz isso, pois nas primeiras linhas ele verifica se o arquivo de destino existe e, caso exista, ele o apaga.

Se vc quiser apenas modificar o arquivo adicionando linhas ao que já está escrito eu tenho esse método que talvez o ajude:
private void processaArquivos() {
        final File arquivoCriptografadas = new File("saida\\saidas_criptografas.txt");
        
        try {
            if (!arquivoCriptografadas.exists()) {
                arquivoCriptografadas.createNewFile();
            }

            final FileWriter arquivoSaidaCriptografadas = new FileWriter(arquivoCriptografadas, true);
            final BufferedWriter arquivoSaidaCriptografadasBuferizado = new BufferedWriter(arquivoSaidaCriptografadas, 1024 * 1024);
            final PrintWriter textoSaidaCriptografadas = new PrintWriter(arquivoSaidaCriptografadasBuferizado, false);
            textoSaidaCriptografadas.print(this.getTextoArquivoSucess());
            textoSaidaCriptografadas.close();
            arquivoSaidaCriptografadasBuferizado.close();
            arquivoSaidaCriptografadas.close();

        } catch (final IOException e) {
            e.printStackTrace();
            Runtime.getRuntime().exit(0);
        }
        Runtime.getRuntime().exit(0);
    }
pgioseffi
ViniGodoy:
Melhor ainda é copiar usando o FileChannel:
public static void copyFile(File source, File destination) throws IOException {
        if (destination.exists())
            destination.delete();

        FileChannel sourceChannel = null;
        FileChannel destinationChannel = null;

        try {
            sourceChannel = new FileInputStream(source).getChannel();
            destinationChannel = new FileOutputStream(destination).getChannel();
            sourceChannel.transferTo(0, sourceChannel.size(),
                    destinationChannel);
        } finally {
            if (sourceChannel != null && sourceChannel.isOpen())
                sourceChannel.close();
            if (destinationChannel != null && destinationChannel.isOpen())
                destinationChannel.close();
       }
   }

Prezado ViniGodoy,

Como você faria para fazer cópia de um arquivo com extensão .GIF que está na Web?

Eu usei o código abaixo que funciona com as extensões JPEG e PNG, mas não funcionam para .GIF:
final String urlGoogleLogoGif = "http://www.doobybrain.com/wp-content/uploads/2008/01/google-logo.gif";  
                 if (ImageIO.write(ImageIO.read(new URL(urlGoogleLogoGif ).openStream()), "GIF",  
                                   ImageIO.createImageOutputStream(new File("C:\\images\\teste01.gif")))) {  
                     System.out.println("Baixou");    
                 }

Se você utilizar o mesmo código acima, apenas modificando o arquivo para um tipo JPEG ou PNG, conforme abaixo, ele funciona:

final String urlGoogleLogo = "http://www.google.com.br/intl/en_com/images/srpr/logo1w.png";  
                 if (ImageIO.write(ImageIO.read(new URL(urlGoogleLogo).openStream()), "PNG",  
                                   ImageIO.createImageOutputStream(new File("C:\\images\\teste01.png")))) {  
                   System.out.println("Baixou");    
                 }

Saberia me ajudar nessa?

kesselring

Ao utilizar o código do Vinny.
Aparece erro de acesso negado.

public static void copiarArquivos(File source, File destination) throws IOException {  
     
        if (destination.exists())  
         destination.delete();  
  
     FileChannel sourceChannel = null;  
     FileChannel destinationChannel = null;  
  
     try {  
         sourceChannel = new FileInputStream(source).getChannel();  
         destinationChannel = new FileOutputStream(destination).getChannel();  
         sourceChannel.transferTo(0, sourceChannel.size(),  
                 destinationChannel);  
     } finally {  
         if (sourceChannel != null && sourceChannel.isOpen())  
             sourceChannel.close();  
         if (destinationChannel != null && destinationChannel.isOpen())  
             destinationChannel.close();  
    }  
}

No console tem o seguinte erro

[color=red] Exception in thread main java.io.FileNotFoundException: C:\Documents and Settings\Albert\Desktop\Origem (Acesso negado)

at java.io.FileInputStream.open(Native Method)

at java.io.FileInputStream.<init>(FileInputStream.java:138)

at Arquivos.copiarArquivos(Arquivos.java:18)

at SCN.main(SCN.java:11)

Java Result: 1

[/color]
ViniGodoy

Se o acesso foi negado, vc não tem permissão para ler ou para escrever o arquivo de saída.
Verifique isso no seu SO.

kesselring

Olá;
Eu estava passando no parâmetro um diretório. Quando passei um arquivo ele acessou.

A

Uma dúvida. Se tenho um arquivo com espaço ele coloca % no lugar e por isso não acha o arquivo, como posso resolver isso?

A
ViniGodoy:
Melhor ainda é copiar usando o FileChannel:
public static void copyFile(File source, File destination) throws IOException {
        if (destination.exists())
            destination.delete();

        FileChannel sourceChannel = null;
        FileChannel destinationChannel = null;

        try {
            sourceChannel = new FileInputStream(source).getChannel();
            destinationChannel = new FileOutputStream(destination).getChannel();
            sourceChannel.transferTo(0, sourceChannel.size(),
                    destinationChannel);
        } finally {
            if (sourceChannel != null && sourceChannel.isOpen())
                sourceChannel.close();
            if (destinationChannel != null && destinationChannel.isOpen())
                destinationChannel.close();
       }
   }

E se o arquivo ter espaços como faço para resolver o problema?

V

ViniGodoy e entanglement muito obrigado pelas dicas de vocês nesse post. Me ajudou muito. Utilizava um outro método para fazer isso, mas acabava quebrando o arquivo. Esse funciona muito bem.

Para aqueles que ficaram um pouco perdidos em como utilizar o método. Segue a sequência de uso. O do entanglement você utiliza no botão, ou outro componente que irá chamar o seu método.

entanglement:
File f = new File ("C:\\diretorio\\arquivo.txt"); // Windows
ou
File f = new File ("/home/joselito/arquivo.txt"); // Linux, Unix, MacOSX
ViniGodoy:
Melhor ainda é copiar usando o FileChannel:
public static void copyFile(File source, File destination) throws IOException {
        if (destination.exists())
            destination.delete();

        FileChannel sourceChannel = null;
        FileChannel destinationChannel = null;

        try {
            sourceChannel = new FileInputStream(source).getChannel();
            destinationChannel = new FileOutputStream(destination).getChannel();
            sourceChannel.transferTo(0, sourceChannel.size(),
                    destinationChannel);
        } finally {
            if (sourceChannel != null && sourceChannel.isOpen())
                sourceChannel.close();
            if (destinationChannel != null && destinationChannel.isOpen())
                destinationChannel.close();
       }
   }
I

Vini,
Na atribuiçao:

sourceChannel = new FileInputStream(source).getChannel();

Esta acusando: incompatible types: java.nio.channels.FileChannel cannot be converted to redirectfiles.FileChannel

(Alt-Enter mostra dicas)

Copiei o código exatamente igual ao seu e fiz apenas os imports:

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

Pode me ajudar por favor ?

ViniGodoy

Provavelmente você errou o import. Faça no seu código um

import java.nio.channels.FileChannel

E retire o import:

import redirectfiles.FileChannel

Que seu code completion deve ter inserido por acidente.

Convém também ressaltar que no Java 8 existe um jeito ainda mais fácil de fazer isso, que dispensa totalmente a criação de um novo método, basta usar o Files.copy:

Path source = Paths.get("C:\\Temp\\source.txt");
Path destination = Paths.get("C:\\Temp\\destination.txt");
Files.copy(source, destination);
I

Ok Vini!
Optei pela sua segunda sugestão (Files.Copy), que inclusive copia de um diretório para outro.
Muito obrigado.

jallisson_jallis

realmente simples e funcional!

D

Boa tarde como ficou o código, você conseguiu alteras as Strings de endereço?
Eu estou com o mesmo problema.

Desde já Obrigado!

D

Boa tarde como ficou o código, você conseguiu alteras as Strings de endereço?
Eu estou com o mesmo problema.

Desde já Obrigado!

Criado 29 de setembro de 2010
Ultima resposta 16 de ago. de 2017
Respostas 23
Participantes 13