Como copiar um arquivo com Java
1. Visão geral
Neste artigo, abordaremos maneiras comuns de copiar arquivos em Java.
Primeiro, usaremos as APIsIO eNIO.2 padrão e duas bibliotecas externas:commons-ioeguava.
2. APIIO (antes de JDK7)
Primeiro de tudo,tocopy a file with java.io API, we’re required to open a stream, loop through the content and write it out to another stream:
@Test
public void givenIoAPI_whenCopied_thenCopyExistsWithSameContents()
throws IOException {
File copied = new File("src/test/resources/copiedWithIo.txt");
try (
InputStream in = new BufferedInputStream(
new FileInputStream(original));
OutputStream out = new BufferedOutputStream(
new FileOutputStream(copied))) {
byte[] buffer = new byte[1024];
int lengthRead;
while ((lengthRead = in.read(buffer)) > 0) {
out.write(buffer, 0, lengthRead);
out.flush();
}
}
assertThat(copied).exists();
assertThat(Files.readAllLines(original.toPath())
.equals(Files.readAllLines(copied.toPath())));
}
Muito trabalho para implementar essa funcionalidade básica.
Felizmente para nós,Java has improved its core APIs and we have a simpler way of copying files using NIO.2 API.
3. APINIO.2 (JDK7)
O uso deNIO.2 pode aumentar significativamente o desempenho de cópia de arquivos, poisNIO.2 utiliza pontos de entrada do sistema de nível inferior.
Vamos dar uma olhada em como o método Files.copy() funciona.
O métodocopy() nos dá a capacidade de especificar um argumento opcional que representa uma opção de cópia. By default, copying files and directories won’t overwrite existing ones, nor will it copy file attributes.
Esse comportamento pode ser alterado usando as seguintes opções de cópia:
-
REPLACE_EXISTING – substitui um arquivo se ele existir
-
COPY_ATTRIBUTES – copia metadados para o novo arquivo
-
NOFOLLOW_LINKS – não deve seguir links simbólicos
A classeNIO.2 Files fornece um conjunto de métodoscopy() sobrecarregados para copiar arquivos e diretórios dentro do sistema de arquivos.
Vamos dar uma olhada em um exemplo usandocopy() com dois argumentosPath:
@Test
public void givenNIO2_whenCopied_thenCopyExistsWithSameContents()
throws IOException {
Path copied = Paths.get("src/test/resources/copiedWithNio.txt");
Path originalPath = original.toPath();
Files.copy(originalPath, copied, StandardCopyOption.REPLACE_EXISTING);
assertThat(copied).exists();
assertThat(Files.readAllLines(originalPath)
.equals(Files.readAllLines(copied)));
}
Observe quedirectory copies are shallow, significando que os arquivos e subdiretórios dentro do diretório não são copiados.
4. Apache Commons IO
Outra maneira comum de copiar um arquivo com Java é usando a bibliotecacommons-io.
Primeiro, precisamos adicionar a dependência:
commons-io
commons-io
2.6
A versão mais recente pode ser baixada deMaven Central.
Então, para copiar um arquivo nós só precisamos usar ocopyFile() method defined in the FileUtils class.. O método pega um arquivo fonte e um arquivo alvo.
Vamos dar uma olhada em um teste JUnit usando o métodocopyFile():
@Test
public void givenCommonsIoAPI_whenCopied_thenCopyExistsWithSameContents()
throws IOException {
File copied = new File(
"src/test/resources/copiedWithApacheCommons.txt");
FileUtils.copyFile(original, copied);
assertThat(copied).exists();
assertThat(Files.readAllLines(original.toPath())
.equals(Files.readAllLines(copied.toPath())));
}
5. Goiaba
Por fim, daremos uma olhada na biblioteca Guava do Google.
Novamente, se quisermos usar Guava,, precisamos incluir a dependência:
com.google.guava
guava
23.0
A versão mais recente pode ser encontradaon Maven Central.
E esta é a maneira do Guava de copiar um arquivo:
@Test
public void givenGuava_whenCopied_thenCopyExistsWithSameContents()
throws IOException {
File copied = new File("src/test/resources/copiedWithGuava.txt");
com.google.common.io.Files.copy(original, copied);
assertThat(copied).exists();
assertThat(Files.readAllLines(original.toPath())
.equals(Files.readAllLines(copied.toPath())));
}
6. Conclusão
Neste artigo, exploramos as maneiras mais comuns de copiar um arquivo em Java.
A implementação completa deste artigo pode ser encontradaover on Github.