Ce face Files.copy
Files.copy(sursa, destinatie) face o copie a fișierului. Implicit, dacă destinația există deja, aruncă FileAlreadyExistsException. Cu StandardCopyOption.REPLACE_EXISTING o înlocuiește, iar cu COPY_ATTRIBUTES păstrează și data modificării.
Pentru un folder, copy creează doar un folder gol la destinație, fără conținut. Copierea unui folder întreg se face parcurgându-l cu Files.walk.
Alte două variante copiază dintr-un InputStream într-un fișier (de exemplu o descărcare) sau dintr-un fișier într-un OutputStream.
Parametri
| Parametru | Descriere |
|---|---|
sursa |
Fișierul copiat. |
destinatie |
Calea noii copii (inclusiv numele fișierului). |
optiuni |
Opțional: REPLACE_EXISTING, COPY_ATTRIBUTES. |
Ce returnează
Calea destinației (sau numărul de octeți copiați, la variantele cu stream).
Exemple
Exemplul 1: O copie de siguranță
import java.io.IOException;
import java.nio.file.FileAlreadyExistsException;
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 original = Path.of("contacte.txt");
Path copie = Path.of("contacte.bak");
Files.writeString(original, "Ana 0722 111 222\n");
Files.copy(original, copie);
System.out.print("Copie: " + Files.readString(copie));
Files.writeString(original, "Ana 0722 111 222\nRadu 0744 333 444\n");
try {
Files.copy(original, copie);
} catch (FileAlreadyExistsException e) {
System.out.println("Copia există deja, nu o suprascriu.");
}
Files.copy(original, copie, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Rânduri în copie: " + Files.readAllLines(copie).size());
}
}
Rezultat
Copie: Ana 0722 111 222
Copia există deja, nu o suprascriu.
Rânduri în copie: 2
Exemplul 2: Copiere dintr-un InputStream
Datele vin dintr-un stream în memorie (ar putea veni și din rețea) și ajung într-un fișier.
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
public class Main {
public static void main(String[] args) throws IOException {
InputStream date = new ByteArrayInputStream("Iași;Cluj;Timișoara".getBytes(StandardCharsets.UTF_8));
long octeti = Files.copy(date, Path.of("orase.csv"));
System.out.println("Octeți copiați: " + octeti);
System.out.println(Files.readString(Path.of("orase.csv")));
}
}
Rezultat
Octeți copiați: 21
Iași;Cluj;Timișoara
Greșeli frecvente
- Dai ca destinație un folder (
Path.of("backup")) în loc de calea fișierului. Scriebackup.resolve(original.getFileName()). - Te aștepți ca un folder să fie copiat cu tot conținutul.
copycreează doar folderul gol.
Comenzi înrudite
Files.move: Mută sau redenumește un fișier ori un folder; cu REPLACE_EXISTING suprascrie destinația.Files.delete: Șterge un fișier sau un folder gol; delete aruncă excepție dacă lipsește, deleteIfExists doar returnează false.Path.resolve: Adaugă o cale la sfârșitul altei căi: folder.resolve(„note.txt”) dă folder/note.txt.InputStream: Clasa de bază pentru citirea de octeți (fișiere, rețea, System.in); readAllBytes citește tot conținutul într-un byte[].