Médio Java

Cópia de arquivo com múltiplos recursos

Enunciado

Implemente um programa que copie o conteúdo de origem.txt para destino.txt. Use try-with-resources com múltiplos recursos (leitura e escrita) no mesmo bloco. Se origem.txt não existir, crie-o com um conteúdo de exemplo antes da cópia.

Requisitos

  • Declare dois recursos no mesmo try-with-resources: um para leitura e outro para escrita.
  • Trate IOException com um bloco catch.
  • O arquivo de destino deve conter exatamente o mesmo conteúdo do arquivo de origem.
  • Exiba uma mensagem de sucesso ao final.

Código inicial

import java.io.*;

public class CopiaArquivo {
    public static void main(String[] args) {
        // Seu código aqui
    }
}

Saída esperada

Cópia realizada com sucesso!
Ver dica

Use BufferedReader para ler e BufferedWriter para escrever. Declare ambos no mesmo try, separados por ponto e vírgula. O fechamento ocorre na ordem inversa da declaração.

Mostrar solução
import java.io.*;

public class CopiaArquivo {
    public static void main(String[] args) {
        File origem = new File("origem.txt");
        File destino = new File("destino.txt");

        // Cria arquivo de origem se não existir
        if (!origem.exists()) {
            try (PrintWriter pw = new PrintWriter(origem)) {
                pw.println("Conteúdo de exemplo");
                pw.println("Segunda linha");
            } catch (FileNotFoundException e) {
                System.err.println("Erro ao criar origem: " + e.getMessage());
                return;
            }
        }

        // Cópia com múltiplos recursos
        try (BufferedReader br = new BufferedReader(new FileReader(origem));
             BufferedWriter bw = new BufferedWriter(new FileWriter(destino))) {
            String linha;
            while ((linha = br.readLine()) != null) {
                bw.write(linha);
                bw.newLine();
            }
            System.out.println("Cópia realizada com sucesso!");
        } catch (IOException e) {
            System.err.println("Erro na cópia: " + e.getMessage());
        }
    }
}

Passo a passo

  1. Definimos os arquivos de origem e destino com File.
  2. Se origem.txt não existir, criamos com PrintWriter (também com try-with-resources).
  3. No bloco try, declaramos dois recursos: BufferedReader para ler e BufferedWriter para escrever, separados por ;.
  4. O loop lê cada linha da origem e escreve no destino, adicionando uma nova linha com bw.newLine().
  5. Após o loop, exibimos a mensagem de sucesso.
  6. Ao sair do bloco, ambos os recursos são fechados automaticamente na ordem inversa: primeiro bw, depois br.

Por que funciona

O try-with-resources com múltiplos recursos garante que ambos sejam fechados, mesmo que ocorra uma exceção durante a cópia. A ordem de fechamento é inversa à declaração, o que é importante quando um recurso depende do outro (ex.: BufferedWriter depende do FileWriter).

Erros comuns

  • Esquecer de dar newLine(): As linhas ficam todas juntas sem quebra.
  • Não tratar IOException: O compilador exige tratamento.
  • Declarar recursos fora do try: Se declarar antes, o fechamento automático não ocorre.
  • Ordem de declaração errada: Se BufferedWriter for declarado antes do FileWriter, pode causar confusão, mas o compilador aceita. O ideal é declarar na ordem de dependência.

Outra forma de resolver

Usar Files.copy da API NIO:

Files.copy(origem.toPath(), destino.toPath(), StandardCopyOption.REPLACE_EXISTING);

É mais conciso, mas não demonstra try-with-resources.

Saída esperada

Cópia realizada com sucesso!