如何在 Java 中将文件从一个位置移动到另一个位置?

Posted

技术标签:

【中文标题】如何在 Java 中将文件从一个位置移动到另一个位置?【英文标题】:How do I move a file from one location to another in Java? 【发布时间】:2011-06-06 10:12:22 【问题描述】:

如何将文件从一个位置移动到另一个位置?当我运行我的程序时,在该位置创建的任何文件都会自动移动到指定位置。我如何知道移动了哪个文件?

【问题讨论】:

首先您询问如何移动一个文件,然后您说某些文件正在自动移动。你能把你的问题说得更清楚吗?。 【参考方案1】:
myFile.renameTo(new File("/the/new/place/newName.file"));

File#renameTo 这样做(它不仅可以重命名,还可以在目录之间移动,至少在同一个文件系统上)。

重命名此抽象路径名表示的文件。

此方法的行为的许多方面本质上是依赖于平台的:重命名操作可能无法将文件从一个文件系统移动到另一个文件系统,它可能不是原子的,如果文件具有目标抽象路径名已存在。应始终检查返回值以确保重命名操作成功。

如果您需要更全面的解决方案(例如想要在磁盘之间移动文件),请查看 Apache Commons FileUtils#moveFile

【讨论】:

myFile.renameTo(new File("/the/new/place/newname.file")); 是的,不要只给新的父目录。并确保那里的路径已经存在。 请注意,该命令不会更新对象myFile 的路径。所以它将指向一个不再存在的文件。 @Sulemankhan - 是的,它也会删除文件。它真的在文件系统上移动它 @JulienKronegg:这可能取决于您的操作系统/文件系统。我认为在 Linux 中您可以移动(或删除)当前打开的文件(并通过现有文件句柄继续访问它们),但在 Windows 上则不行。【参考方案2】:

对于 Java 7 或更高版本,您可以使用 Files.move(from, to, CopyOption... options)

例如

Files.move(Paths.get("/foo.txt"), Paths.get("bar.txt"), StandardCopyOption.REPLACE_EXISTING);

有关详细信息,请参阅Files 文档

【讨论】:

使用 Files.move 获得了 java.nio.file.NoSuchFileException【参考方案3】:

Java 6

public boolean moveFile(String sourcePath, String targetPath) 

    File fileToMove = new File(sourcePath);

    return fileToMove.renameTo(new File(targetPath));

Java 7(使用 NIO)

public boolean moveFile(String sourcePath, String targetPath) 

    boolean fileMoved = true;

    try 

        Files.move(Paths.get(sourcePath), Paths.get(targetPath), StandardCopyOption.REPLACE_EXISTING);

     catch (Exception e) 

        fileMoved = false;
        e.printStackTrace();
    

    return fileMoved;

【讨论】:

【参考方案4】:

来自 Java IO 的File.renameTo 可用于在 Java 中移动文件。另见this SO question。

【讨论】:

在尝试重命名之前确保源文件已关闭。【参考方案5】:

要移动文件,您还可以使用 Jakarta Commons ios FileUtils.moveFile

出错时它会抛出一个IOException,所以当没有抛出异常时,你就知道文件被移动了。

【讨论】:

【参考方案6】:

只需添加源和目标文件夹路径即可。

它将所有文件和文件夹从源文件夹移动到 目标文件夹。

    File destinationFolder = new File("");
    File sourceFolder = new File("");

    if (!destinationFolder.exists())
    
        destinationFolder.mkdirs();
    

    // Check weather source exists and it is folder.
    if (sourceFolder.exists() && sourceFolder.isDirectory())
    
        // Get list of the files and iterate over them
        File[] listOfFiles = sourceFolder.listFiles();

        if (listOfFiles != null)
        
            for (File child : listOfFiles )
            
                // Move files to destination folder
                child.renameTo(new File(destinationFolder + "\\" + child.getName()));
            

            // Add if you want to delete the source folder 
            sourceFolder.delete();
        
    
    else
    
        System.out.println(sourceFolder + "  Folder does not exists");
    

【讨论】:

【参考方案7】:
Files.move(source, target, REPLACE_EXISTING);

您可以使用Files 对象

阅读更多关于Files

【讨论】:

在尝试将其移动到目标之前确保源已关闭 将所有文件从源移动到目标后,它也会删除源目录@Daniel Taub【参考方案8】:

您可以为该任务执行外部工具(如 Windows 环境中的 copy),但为了保持代码可移植性,一般方法是:

    将源文件读入内存 将内容写入新位置的文件 删除源文件

File#renameTo 只要源和目标位置在同一个卷上就可以工作。我个人会避免使用它将文件移动到不同的文件夹。

【讨论】:

@BullyWiiPlaza:阅读 Thilo 回答中的重要免责声明。它在某些平台(例如 Windows)上以多种方式被破坏。【参考方案9】:

试试这个:-

  boolean success = file.renameTo(new File(Destdir, file.getName()));

【讨论】:

【参考方案10】:

你可以试试这个..干净的解决方案

Files.move(source, target, REPLACE_EXISTING);

【讨论】:

这给了我javax.script.ScriptException: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: REPLACE_EXISTING 将所有文件从源移动到目标后,它也会删除源目录@Saurabh Verma【参考方案11】:

编写此方法是为了在我自己的项目中执行此操作,如果其中存在逻辑,则仅使用替换文件。

// we use the older file i/o operations for this rather than the newer jdk7+ Files.move() operation
private boolean moveFileToDirectory(File sourceFile, String targetPath) 
    File tDir = new File(targetPath);
    if (tDir.exists()) 
        String newFilePath = targetPath+File.separator+sourceFile.getName();
        File movedFile = new File(newFilePath);
        if (movedFile.exists())
            movedFile.delete();
        return sourceFile.renameTo(new File(newFilePath));
     else 
        LOG.warn("unable to move file "+sourceFile.getName()+" to directory "+targetPath+" -> target directory does not exist");
        return false;
           

【讨论】:

【参考方案12】:

请试试这个。

 private boolean filemovetoanotherfolder(String sourcefolder, String destinationfolder, String filename) 
            boolean ismove = false;
            InputStream inStream = null;
            OutputStream outStream = null;

            try 

                File afile = new File(sourcefolder + filename);
                File bfile = new File(destinationfolder + filename);

                inStream = new FileInputStream(afile);
                outStream = new FileOutputStream(bfile);

                byte[] buffer = new byte[1024 * 4];

                int length;
                // copy the file content in bytes
                while ((length = inStream.read(buffer)) > 0) 

                outStream.write(buffer, 0, length);

                


                // delete the original file
                afile.delete();
                ismove = true;
                System.out.println("File is copied successful!");

             catch (IOException e) 
                e.printStackTrace();
            finally
               inStream.close();
               outStream.close();
            
            return ismove;
            

【讨论】:

如果close 指令位于finally 块中,或者它使用了try-with-resources 块,这将更加健壮。 我已经改了 现在应该可以了

以上是关于如何在 Java 中将文件从一个位置移动到另一个位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在PHP中将所有文件和文件夹从一个目录移动到另一个目录?

如何将文件从一个位置复制到另一个位置?

如何将文件从一个位置复制到另一个位置?

React中将对象从数组移动到数组到另一个对象时的位置镜像

如何在 MS Access 中将邮件从一个链接的 Exchange 邮箱移动到另一个邮箱

如何在 PHP 中将上传的文件移动到另一台主机