Как переместить файл из одного места в другое в Java?


95

Как переместить файл из одного места в другое? Когда я запускаю свою программу, любой файл, созданный в этом месте, автоматически перемещается в указанное место. Как узнать, какой файл перемещен?


Сначала вы спрашиваете, как переместить один файл, затем говорите, что некоторые файлы перемещаются автоматически. Не могли бы вы прояснить свой вопрос?
Хайме

Ответы:


132
myFile.renameTo(new File("/the/new/place/newName.file"));

Это делает файл # renameTo (он может не только переименовывать, но и перемещаться между каталогами, по крайней мере, в одной файловой системе).

Переименовывает файл, обозначенный этим абстрактным путем.

Многие аспекты поведения этого метода по своей сути зависят от платформы: операция переименования может не иметь возможности переместить файл из одной файловой системы в другую, она может быть не атомарной и может не завершиться успешно, если файл с конечным абстрактным путем уже существует. Возвращаемое значение всегда следует проверять, чтобы убедиться, что операция переименования прошла успешно.

Если вам нужно более комплексное решение (например, вы хотите переместить файл между дисками), посмотрите Apache Commons FileUtils # moveFile


9
myFile.renameTo (новый файл ("/ the / new / place / newname.file"));
djangofan 01

4
Да не просто дать новый родительский каталог. И убедитесь, что путь туда уже существует.
Тило

2
Обратите внимание, что myFileпуть к объекту не обновляется этой командой. Таким образом, он будет указывать на файл, которого больше нет.
Евгений Сергеев

1
@Sulemankhan - да, тоже удаляет файл. Он действительно перемещает его в файловую систему
Леоле

2
@JulienKronegg: Вероятно, это зависит от вашей ОС / файловой системы. Я думаю, что в Linux вы можете перемещать (или удалять) файлы, которые в настоящее время открыты (и продолжать получать к ним доступ через существующий дескриптор файла), но не в Windows.
Тило

63

С Java 7 или новее вы можете использовать Files.move(from, to, CopyOption... options).

Например

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

См. Документацию по файлам для более подробной информации.


1
получил исключение java.nio.file.NoSuchFileException с помощью Files.move
zhuochen shen

5

Чтобы переместить файл, вы также можете использовать Jakarta Commons IOs IOs FileUtils.moveFile

При ошибке он выдает IOException, поэтому, когда исключение не возникает, вы знаете, что файл был перемещен.



4

Просто добавьте пути к исходной и целевой папкам.

Он переместит все файлы и папки из исходной папки в целевую.

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

4

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

2

Вы можете выполнить внешний инструмент для этой задачи (например, copyв среде Windows), но для сохранения переносимости кода общий подход заключается в следующем:

  1. прочитать исходный файл в память
  2. записать содержимое в файл в новом месте
  3. удалить исходный файл

File#renameToбудет работать, пока исходное и целевое расположение находятся на одном томе. Лично я бы не стал использовать его для перемещения файлов в разные папки.


@BullyWiiPlaza: прочтите большой отказ от ответственности в ответе Тило. На некоторых платформах (например, Windows) он сломан по-разному.
AndrewBourgeois



0

Написал этот метод, чтобы сделать именно это в моем собственном проекте, только с файлом замены, если в нем есть логика.

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

0

Пожалуйста, попробуйте это.

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

1
Это было бы более надежно, если бы closeинструкции были в finallyблоке или если бы он использовал блок try-with-resources.
MikaelF

Я изменил это Теперь все должно быть в порядке
Саранга капиларатна

0

Вы можете попробовать это .. чистое решение

Files.move(source, target, REPLACE_EXISTING);

Это дает мнеjavax.script.ScriptException: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: REPLACE_EXISTING
msoutopico
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.