Files.copy în Java

Copiază un fișier în altă locație; cu StandardCopyOption.REPLACE_EXISTING suprascrie destinația dacă există.

Sintaxă
static Path copy(Path sursa, Path destinatie, CopyOption... optiuni) throws IOException
static long copy(InputStream intrare, Path destinatie, CopyOption... optiuni) throws IOException
static long copy(Path sursa, OutputStream iesire) throws IOException

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. Scrie backup.resolve(original.getFileName()).
  • Te aștepți ca un folder să fie copiat cu tot conținutul. copy creează 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[].