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
IOExceptioncom um blococatch. - 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
- Definimos os arquivos de origem e destino com
File. - Se
origem.txtnão existir, criamos comPrintWriter(também com try-with-resources). - No bloco
try, declaramos dois recursos:BufferedReaderpara ler eBufferedWriterpara escrever, separados por;. - O loop lê cada linha da origem e escreve no destino, adicionando uma nova linha com
bw.newLine(). - Após o loop, exibimos a mensagem de sucesso.
- Ao sair do bloco, ambos os recursos são fechados automaticamente na ordem inversa: primeiro
bw, depoisbr.
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
BufferedWriterfor declarado antes doFileWriter, 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!