Java - Renomear ou mover um arquivo

Java - Renomear ou mover um arquivo

1. Visão geral

Neste tutorial rápido, vamos dar uma olhada emrenaming / moving a File in Java - primeiro usando JDK 6, depois JDK 7 com NIO, Google Guava e finalmente a biblioteca Apache Commons IO.

Este artigo faz parte dethe “Java – Back to Basic” series aqui no exemplo.

Leitura adicional:

Como copiar um arquivo com Java

Veja algumas maneiras comuns de copiar arquivos em Java.

Read more

Introdução à API de arquivos Java NIO2

Um guia rápido e prático para a API de arquivos Java NIO2

Read more

Tamanho do arquivo em Java

Exemplos de como obter o tamanho de um arquivo em Java.

Read more

2. Com JDK 6

Vamos começar com o Java simples, solução JDK6:

@Test
public void givenUsingJDK6_whenMovingFile_thenCorrect() throws IOException {
    File fileToMove = new File("src/test/resources/toMoveFile_jdk6.txt");
    boolean isMoved = fileToMove.renameTo(new File("src/test/resources/movedFile_jdk6.txt"));
    if (!isMoved) {
        throw new FileSystemException("src/test/resources/movedFile_jdk6.txt");
    }
}

Neste exemplo - o arquivo a ser movido existe, assim como o diretório de destino.

Observe querenameTo() só lança dois tipos de exceções -SecurityException - se um gerente de segurança negar acesso de gravação para a origem ou para o destino, eNullPointerException - no caso de o parâmetro de destino ser nulo . Se o destino não existir em um sistema de arquivos -no exception will be thrown - e você terá que verificar o sinalizador de sucesso retornado do método.

3. Com JDK 7

Vejamos agora como podemos fazer o mesmo usando NIO e JDK 7:

@Test
public void givenUsingJDK7Nio2_whenMovingFile_thenCorrect() throws IOException {
    Path fileToMovePath =
      Files.createFile(Paths.get("src/test/resources/" + randomAlphabetic(5) + ".txt"));
    Path targetPath = Paths.get("src/main/resources/");

    Files.move(fileToMovePath, targetPath.resolve(fileToMovePath.getFileName()));
}

No JDK7, o pacote NIO foi significativamente atualizado e oPath adicionado - fornece métodos para manipulação conveniente de artefatos do sistema de arquivos.

Observe que, da mesma forma que no exemplo anterior - o arquivo e o diretório de destino devem existir.

4. Com goiaba

A seguir - vamos dar uma olhada na solução Guava:

@Test
public void givenUsingGuava_whenMovingFile_thenCorrect()
  throws IOException {
    File fileToMove = new File("src/test/resources/fileToMove.txt");
    File destDir = new File("src/test/resources/");
    File targetFile = new File(destDir, fileToMove.getName());

    com.google.common.io.Files.move(fileToMove, targetFile);
}

Novamente, neste exemplo, o arquivo a ser movido e o diretório de destino precisam existir.

5. Com Commons IO

Finalmente, vamos dar uma olhada em uma solução com Apache Commons IO - provavelmente a mais simples:

@Test
public void givenUsingApache_whenMovingFile_thenCorrect() throws IOException {
    FileUtils.moveFile(
      FileUtils.getFile("src/test/resources/fileToMove.txt"),
      FileUtils.getFile("src/test/resources/fileMoved.txt"));
}

Essa linha permitirá, obviamente, mover ou renomear - dependendo se o diretório de destino for o mesmo ou não.

Alternativamente - aqui está uma solução para mover especificamente, também nos permitindo criar automaticamente o diretório de destino se ele ainda não existir:

@Test
public void givenUsingApache_whenMovingFileApproach2_thenCorrect() throws IOException {
    FileUtils.moveFileToDirectory(
      FileUtils.getFile("src/test/resources/fileToMove.txt"),
      FileUtils.getFile("src/main/resources/"), true);
}

6. Conclusão

We looked at renaming in these code snippets, mas mover é, obviamente, o mesmo, apenas o diretório de destino precisa ser diferente.

E aí está - 5 soluções rápidas para mover um arquivo em Java.