Files.move în Java

Mută sau redenumește un fișier ori un folder; cu REPLACE_EXISTING suprascrie destinația.

Sintaxă
static Path move(Path sursa, Path destinatie, CopyOption... optiuni) throws IOException

Ce face Files.move

Files.move(sursa, destinatie) mută fișierul la noua cale. Dacă destinația este în același folder, operația este de fapt o redenumire. După mutare, sursa nu mai există.

Dacă destinația există, aruncă FileAlreadyExistsException; cu StandardCopyOption.REPLACE_EXISTING o înlocuiește. Opțiunea ATOMIC_MOVE cere ca mutarea să fie „totul sau nimic”, util când alt program citește fișierul în același timp.

Un folder întreg se poate muta sau redenumi pe același disc. Mutarea unui folder cu conținut pe alt disc nu este posibilă dintr-o singură apelare.

Parametri

Parametru Descriere
sursa Fișierul sau folderul mutat.
destinatie Noua cale, inclusiv noul nume.
optiuni Opțional: REPLACE_EXISTING, ATOMIC_MOVE.

Ce returnează

Calea destinației.

Exemple

Exemplul 1: Redenumire și mutare într-un folder

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class Main {
    public static void main(String[] args) throws IOException {
        Path ciorna = Path.of("ciorna.txt");
        Files.writeString(ciorna, "Cerere de concediu - Ana Popescu");

        Path cerere = Files.move(ciorna, Path.of("cerere.txt"));
        System.out.println("ciorna.txt există? " + Files.exists(ciorna));
        System.out.println("cerere.txt există? " + Files.exists(cerere));

        Path trimise = Files.createDirectory(Path.of("trimise"));
        Path laDestinatie = Files.move(cerere, trimise.resolve(cerere.getFileName()));
        System.out.println("Acum la: " + laDestinatie);
        System.out.println(Files.readString(laDestinatie));
    }
}

Rezultat

ciorna.txt există? false
cerere.txt există? true
Acum la: trimise/cerere.txt
Cerere de concediu - Ana Popescu

Exemplul 2: Înlocuirea unui fișier existent

Scriem întâi într-un fișier temporar, apoi îl mutăm peste cel vechi. Așa fișierul final nu rămâne pe jumătate scris dacă programul se oprește brusc.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;

public class Main {
    public static void main(String[] args) throws IOException {
        Path stoc = Path.of("stoc.txt");
        Files.writeString(stoc, "mere=10\n");

        Path nou = Path.of("stoc.txt.tmp");
        Files.writeString(nou, "mere=7\npere=3\n");
        Files.move(nou, stoc, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE);

        System.out.print(Files.readString(stoc));
        System.out.println("Temporar rămas? " + Files.exists(nou));
    }
}

Rezultat

mere=7
pere=3
Temporar rămas? false

Greșeli frecvente

  • Te aștepți ca move să facă o copie. Sursa dispare.
  • Dai ca destinație doar folderul: Java încearcă să înlocuiască folderul cu fișierul. Adaugă numele: folder.resolve(fisier.getFileName()).

Comenzi înrudite

  • Files.copy: Copiază un fișier în altă locație; cu StandardCopyOption.REPLACE_EXISTING suprascrie destinația dacă există.
  • Files.delete: Șterge un fișier sau un folder gol; delete aruncă excepție dacă lipsește, deleteIfExists doar returnează false.
  • Path.getFileName: getFileName dă ultimul nume din cale (fișierul), iar getParent calea fără ultimul nume (folderul care îl conține).
  • Path.resolve: Adaugă o cale la sfârșitul altei căi: folder.resolve(„note.txt”) dă folder/note.txt.