Renomeie um arquivo usando Java

173

Podemos renomear um arquivo test.txtpara test1.txt?

Se test1.txtexistir, será renomeado?

Como o renomeio para o arquivo test1.txt já existente, para que o novo conteúdo do test.txt seja adicionado a ele para uso posterior?

JonasCz - Restabelecer Monica
fonte
6
Seu último parágrafo não descreve uma operação de renomeação. Descreve uma operação de acréscimo.
Marquês de Lorne

Respostas:

172

Copiado de http://exampledepot.8waytrips.com/egs/java.io/RenameFile.html

// File (or directory) with old name
File file = new File("oldname");

// File (or directory) with new name
File file2 = new File("newname");

if (file2.exists())
   throw new java.io.IOException("file exists");

// Rename file (or directory)
boolean success = file.renameTo(file2);

if (!success) {
   // File was not successfully renamed
}

Para acrescentar ao novo arquivo:

java.io.FileWriter out= new java.io.FileWriter(file2, true /*append=yes*/);
Pierre
fonte
24
Este código não funcionará em todos os casos ou plataformas. A renomeação para o método não é confiável: stackoverflow.com/questions/1000183/…
Stephane Grenier
Apenas o Pathcaminho está funcionando para mim, renameTosempre retorna falso. Verifique a resposta de kr37 ou esta resposta
andras
107

Em resumo:

Files.move(source, source.resolveSibling("newname"));

Mais detalhes:

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

O seguinte é copiado diretamente de http://docs.oracle.com/javase/7/docs/api/index.html :

Suponha que desejamos renomear um arquivo para "newname", mantendo o arquivo no mesmo diretório:

Path source = Paths.get("path/here");
Files.move(source, source.resolveSibling("newname"));

Como alternativa, suponha que desejemos mover um arquivo para um novo diretório, mantendo o mesmo nome e substituindo qualquer arquivo existente com esse nome no diretório:

Path source = Paths.get("from/path");
Path newdir = Paths.get("to/path");
Files.move(source, newdir.resolve(source.getFileName()), REPLACE_EXISTING);
kr37
fonte
1
Path é uma interface cujas únicas implementações são WindowsPath, ZipPath e AbstractPath. Isso será um problema para implementações de várias plataformas?
Caelum
1
Olá @ user2104648, aqui ( tutorials.jenkov.com/java-nio/path.html ) é um exemplo de como você pode lidar com os arquivos no ambiente Linux. Basicamente, você precisa usar java.nio.file.Paths.get (somePath) em vez de usar uma das implementações mencionadas
maxivis
2
O que é Path source = ...?
precisa saber é o seguinte
@ resposta impecável kr37!
31519
30

Você deseja utilizar o método renameTo em um objeto File .

Primeiro, crie um objeto File para representar o destino. Verifique se esse arquivo existe. Se não existir, crie um novo objeto File para o arquivo a ser movido. chame o método renameTo no arquivo a ser movido e verifique o valor retornado de renameTo para ver se a chamada foi bem-sucedida.

Se você deseja anexar o conteúdo de um arquivo a outro, há vários escritores disponíveis. Com base na extensão, parece que é um texto sem formatação, então eu examinaria o FileWriter .

Thomas Owens
fonte
9
Não faço ideia, mas é exatamente a mesma coisa que Pierre postou, sem o código-fonte ...
Thomas Owens
28

Para Java 1.6 e inferior, acredito que a API mais segura e limpa para isso é o Files.move do Guava .

Exemplo:

File newFile = new File(oldFile.getParent(), "new-file-name.txt");
Files.move(oldFile.toPath(), newFile.toPath());

A primeira linha garante que o local do novo arquivo seja o mesmo diretório, ou seja, o diretório pai do arquivo antigo.

Edição: Eu escrevi isso antes de começar a usar o Java 7, que introduziu uma abordagem muito semelhante. Portanto, se você estiver usando o Java 7+, deverá ver e atualizar a resposta do kr37.

Zoltán
fonte
18

Renomeando o arquivo movendo-o para um novo nome. (FileUtils é do Apache Commons IO lib)

  String newFilePath = oldFile.getAbsolutePath().replace(oldFile.getName(), "") + newName;
  File newFile = new File(newFilePath);

  try {
    FileUtils.moveFile(oldFile, newFile);
  } catch (IOException e) {
    e.printStackTrace();
  }
Brandon
fonte
13

Esta é uma maneira fácil de renomear um arquivo:

        File oldfile =new File("test.txt");
        File newfile =new File("test1.txt");

        if(oldfile.renameTo(newfile)){
            System.out.println("File renamed");
        }else{
            System.out.println("Sorry! the file can't be renamed");
        }
Senior
fonte
5
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import static java.nio.file.StandardCopyOption.*;

Path yourFile = Paths.get("path_to_your_file\text.txt");

Files.move(yourFile, yourFile.resolveSibling("text1.txt"));

Para substituir um arquivo existente pelo nome "text1.txt":

Files.move(yourFile, yourFile.resolveSibling("text1.txt"),REPLACE_EXISTING);
Kirill Ch
fonte
5

Tente isto

File file=new File("Your File");
boolean renameResult = file.renameTo(new File("New Name"));
// todo: check renameResult

Nota: Devemos sempre verificar o valor de retorno renameTo para garantir que o arquivo renomeado seja bem-sucedido, pois depende da plataforma (sistema operacional diferente, sistema de arquivos diferente) e não gera exceção de E / S se a renomeação falhar.

anoopknr
fonte
Como isso difere da resposta aceita dada por Pierre 9 anos antes?
Forragem
4

Sim, você pode usar File.renameTo (). Mas lembre-se de ter o caminho correto ao renomeá-lo para um novo arquivo.

import java.util.Arrays;
import java.util.List;

public class FileRenameUtility {
public static void main(String[] a) {
    System.out.println("FileRenameUtility");
    FileRenameUtility renameUtility = new FileRenameUtility();
    renameUtility.fileRename("c:/Temp");
}

private void fileRename(String folder){
    File file = new File(folder);
    System.out.println("Reading this "+file.toString());
    if(file.isDirectory()){
        File[] files = file.listFiles();
        List<File> filelist = Arrays.asList(files);
        filelist.forEach(f->{
           if(!f.isDirectory() && f.getName().startsWith("Old")){
               System.out.println(f.getAbsolutePath());
               String newName = f.getAbsolutePath().replace("Old","New");
               boolean isRenamed = f.renameTo(new File(newName));
               if(isRenamed)
                   System.out.println(String.format("Renamed this file %s to  %s",f.getName(),newName));
               else
                   System.out.println(String.format("%s file is not renamed to %s",f.getName(),newName));
           }
        });

    }
}

}

V1ma-8
fonte
2

Tanto quanto eu sei, renomear um arquivo não anexará seu conteúdo ao de um arquivo existente com o nome do destino.

Sobre como renomear um arquivo em Java, consulte a documentação para o renameTo()método em sala de aula File.

Yuval
fonte
1
Files.move(file.toPath(), fileNew.toPath()); 

funciona, mas somente quando você fecha (ou fecha automaticamente) TODOS os recursos usados ​​( InputStream, FileOutputStreametc.) acho que a mesma situação com file.renameToou FileUtils.moveFile.

Zhurov Konstantin
fonte
1

Aqui está o meu código para renomear vários arquivos em uma pasta com sucesso:

public static void renameAllFilesInFolder(String folderPath, String newName, String extension) {
    if(newName == null || newName.equals("")) {
        System.out.println("New name cannot be null or empty");
        return;
    }
    if(extension == null || extension.equals("")) {
        System.out.println("Extension cannot be null or empty");
        return;
    }

    File dir = new File(folderPath);

    int i = 1;
    if (dir.isDirectory()) { // make sure it's a directory
        for (final File f : dir.listFiles()) {
            try {
                File newfile = new File(folderPath + "\\" + newName + "_" + i + "." + extension);

                if(f.renameTo(newfile)){
                    System.out.println("Rename succesful: " + newName + "_" + i + "." + extension);
                } else {
                    System.out.println("Rename failed");
                }
                i++;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

e execute-o como um exemplo:

renameAllFilesInFolder("E:\\Downloads\\Foldername", "my_avatar", "gif");
Tạ Anh Tú
fonte
-2

O código em execução está aqui.

private static void renameFile(File fileName) {

    FileOutputStream fileOutputStream =null;

    BufferedReader br = null;
    FileReader fr = null;

    String newFileName = "yourNewFileName"

    try {
        fileOutputStream = new FileOutputStream(newFileName);

        fr = new FileReader(fileName);
        br = new BufferedReader(fr);

        String sCurrentLine;

        while ((sCurrentLine = br.readLine()) != null) {
            fileOutputStream.write(("\n"+sCurrentLine).getBytes());
        }

        fileOutputStream.flush();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            fileOutputStream.close();
            if (br != null)
                br.close();

            if (fr != null)
                fr.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
Dinesh Kumar
fonte
2
Geralmente, é melhor explicar uma solução em vez de apenas postar algumas linhas de código anônimo. Você pode ler Como faço para escrever uma resposta boa , e também Explicando respostas totalmente baseada em código
Anh Pham
Copiar e renomear geralmente são operações diferentes, então acho que deve ser claramente marcado que esta é uma cópia. O que também é desnecessariamente lento, pois copia caracteres e não bytes.
Joel Klinghed