Copiar arquivo para outro diretório

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?

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

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

}[/code]

Melhor ainda é copiar usando o FileChannel:

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

}
[/code]

1 curtida

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!

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

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!

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

ou

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

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!

[quote=ViniGodoy]Melhor ainda é copiar usando o FileChannel:

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

}
[/code][/quote]

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

Abração,

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.

Prezado Erwin,

[quote=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! [/quote]

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:

[code]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);
}[/code]

[quote=ViniGodoy]Melhor ainda é copiar usando o FileChannel:

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

}
[/code][/quote]

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?

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]

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.

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

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?

[quote=ViniGodoy]Melhor ainda é copiar usando o FileChannel:

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

}
[/code][/quote]

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

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.

[quote=entanglement] File f = new File ("C:\\diretorio\\arquivo.txt"); // Windows
ou

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

[/quote]

[quote=ViniGodoy]Melhor ainda é copiar usando o FileChannel:

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

}
[/code][/quote]

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 ?

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