使用Java重命名文件


173

我们可以重命名文件说test.txttest1.txt

如果test1.txt存在,它将重命名吗?

如何将其重命名为已经存在的test1.txt文件,以便将test.txt的新内容添加到其中以供以后使用?


6
您的最后一段根本没有描述重命名操作。它描述了追加操作。
洛恩侯爵,2015年

Answers:


172

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
}

追加到新文件:

java.io.FileWriter out= new java.io.FileWriter(file2, true /*append=yes*/);

24
此代码并非在所有情况或平台上均适用。重命名为方法并不可靠:stackoverflow.com/questions/1000183/...
斯特凡·格尼尔

只有Path这样对我有用,renameTo总是返回false。检查kr37的答案还是这个答案
andras

106

简而言之:

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

更多详情:

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

以下内容直接从http://docs.oracle.com/javase/7/docs/api/index.html复制:

假设我们要将文件重命名为“ newname”,并将文件保留在同一目录中:

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

或者,假设我们要将文件移动到新目录,保持相同的文件名,并替换目录中该名称的任何现有文件:

Path source = Paths.get("from/path");
Path newdir = Paths.get("to/path");
Files.move(source, newdir.resolve(source.getFileName()), REPLACE_EXISTING);

1
Path是仅实现WindowsPath,ZipPath和AbstractPath的接口。对于多平台实现,这会成为问题吗?
Caelum 2015年

1
@ user2104648,您好,这里(tutorials.jenkov.com/java-nio/path.html)是一个有关如何在Linux环境中处理文件的示例。基本上,您需要使用java.nio.file.Paths.get(somePath)而不是使用您提到的实现之一
maxivis

2
什么是路径来源= ...?
Koray Tugay

@ kr37完美的答案!
gaurav '19

30

您想在File对象上使用renameTo方法。

首先,创建一个File对象代表目的地。检查该文件是否存在。如果不存在,请为要移动的文件创建一个新的File对象。在要移动的文件上调用renameTo方法,并检查从renameTo返回的值以查看调用是否成功。

如果要将一个文件的内容追加到另一个文件中,则可以使用许多编写器。基于扩展名,听起来像是纯文本,所以我来看看FileWriter


9
不知道,但这是Pierre发布的完全一样的东西,没有源代码……
Thomas Owens

28

对于Java 1.6或更低版本,我认为最安全,最干净的API是Guava的Files.move

例:

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

第一行确保新文件的位置是同一目录,即旧文件的 父目录

编辑: 我在开始使用Java 7之前就编写了此代码,它引入了一种非常相似的方法。因此,如果您使用的是Java 7+,则应该看到并赞成kr37的答案。


18

通过将其移动到新名称来重命名该文件。(FileUtils来自Apache Commons IO库)

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

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

13

这是重命名文件的简单方法:

        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");
        }

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"));

要将现有文件替换为名称“ text1.txt”:

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

5

试试这个

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

注意: 我们应该始终检查renameTo返回值,以确保重命名文件成功,因为重命名文件是平台相关的(不同的操作系统,不同的文件系统),并且如果重命名失败,它不会引发IO异常。


这与9年前Pierre接受的答案有何不同?
牧草

4

是的,您可以使用File.renameTo()。但是请记住在将其重命名为新文件时具有正确的路径。

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));
           }
        });

    }
}

}



2

据我所知,重命名文件不会将其内容追加到具有目标名称的现有文件中。

关于重命名Java中的文件,请参阅该文档renameTo()类方法File


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

作品,但只有当你接近(或自动关闭)所有使用的资源(InputStreamFileOutputStream等等),我想用同样的情况 file.renameToFileUtils.moveFile


1

这是我的代码,可以成功重命名一个文件夹中的多个文件:

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();
            }
        }
    }

}

并运行它作为示例:

renameAllFilesInFolder("E:\\Downloads\\Foldername", "my_avatar", "gif");

-2

运行代码在这里。

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();
        }
    }
}

2
通常,最好解释一个解决方案,而不是仅仅发布一些匿名代码行。您可以阅读《我如何写一个好的答案》,也可以解释完全基于代码的答案
Anh Pham

复制和重命名通常是不同的操作,因此我认为应该清楚地标记这是一个副本。这也恰好是不必要的慢,因为它复制字符而不是字节。
乔尔·克林格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.