Buat Tautan Simbolik dengan Java

1. Ikhtisar

Dalam tutorial ini, kita akan menjelajahi berbagai cara untuk membuat tautan simbolik di Java menggunakan NIO.2 API, dan menjelajahi perbedaan antara tautan file keras dan lunak.

2. Tautan Keras vs Lunak / Simbolik

Pertama, mari kita tentukan apa itu tautan file dan apa perilaku yang diharapkan. Tautan file adalah penunjuk yang secara transparan mereferensikan file yang disimpan dalam sistem file .

Kesalahpahaman yang umum terjadi adalah berpikir bahwa tautan file adalah pintasan, jadi mari kita periksa perilakunya:

  • Pintasan adalah file biasa yang mereferensikan file target
  • Soft / Symbolic link adalah penunjuk file yang berfungsi sebagai file yang ditautkan - jika file target terhapus maka link tidak dapat digunakan
  • Tautan keras adalah penunjuk file yang mencerminkan file yang ditautkan, jadi pada dasarnya seperti klon. Jika file target dihapus, file link masih valid

Sebagian besar sistem operasi (Linux, Windows, Mac) sudah mendukung tautan file lunak / keras, jadi seharusnya tidak menjadi masalah untuk mengatasinya menggunakan NIO API.

3. Membuat Link

Pertama, kita harus membuat file target untuk ditautkan, jadi mari kita mengurutkan beberapa data ke dalam file:

public Path createTextFile() throws IOException { byte[] content = IntStream.range(0, 10000) .mapToObj(i -> i + System.lineSeparator()) .reduce("", String::concat) .getBytes(StandardCharsets.UTF_8); Path filePath = Paths.get("", "target_link.txt"); Files.write(filePath, content, CREATE, TRUNCATE_EXISTING); return filePath; } 

Mari buat tautan simbolis ke file yang ada, memastikan bahwa file yang dibuat adalah tautan simbolis:

public void createSymbolicLink() throws IOException { Path target = createTextFile(); Path link = Paths.get(".","symbolic_link.txt"); if (Files.exists(link)) { Files.delete(link); } Files.createSymbolicLink(link, target); } 

Selanjutnya, mari kita lihat pembuatan tautan keras:

public void createHardLink() throws IOException { Path target = createTextFile(); Path link = Paths.get(".", "hard_link.txt"); if (Files.exists(link)) { Files.delete(link); } Files.createLink(link, target); } 

Dengan membuat daftar file dengan perbedaannya, kita dapat melihat bahwa ukuran file soft / symbolic link kecil, sedangkan hard link menggunakan ruang yang sama dengan file link:

 48K target_link.txt 48K hard_link.txt 4.0K symbolic_link.txt 

Untuk memahami dengan jelas apa saja kemungkinan pengecualian yang dapat dilempar, mari kita lihat pengecualian yang dicentang pada operasi:

  • UnsupportedOperationException - ketika JVM tidak mendukung tautan file dalam sistem tertentu
  • FileAlreadyExistsException - jika file link sudah ada, penggantian tidak didukung secara default
  • IOException - ketika terjadi kesalahan IO, misalnya jalur file tidak valid
  • SecurityException - ketika file link tidak dapat dibuat atau file target tidak dapat diakses karena izin file yang terbatas

4. Operasi Dengan Link

Sekarang, jika kita memiliki sistem file tertentu dengan tautan file yang ada, dimungkinkan untuk mengidentifikasinya dan menampilkan file targetnya:

public void printLinkFiles(Path path) throws IOException { try (DirectoryStream stream = Files.newDirectoryStream(path)) { for (Path file : stream) { if (Files.isDirectory(file)) { printLinkFiles(file); } else if (Files.isSymbolicLink(file)) { System.out.format("File link '%s' with target '%s' %n", file, Files.readSymbolicLink(file)); } } } } 

Jika kami menjalankannya di jalur kami saat ini:

printLinkFiles(Paths.get(".")); 

Kami akan mendapatkan hasilnya:

File link 'symbolic_link.txt' with target 'target_link.txt' 

Perhatikan bahwa file tautan keras tidak hanya dapat diidentifikasi dengan API NIO , operasi tingkat rendah diperlukan untuk mengerjakan file semacam itu.

5. Kesimpulan

Artikel ini menjelaskan berbagai jenis tautan file, perbedaannya dengan pintasan, dan cara membuat serta mengoperasikannya menggunakan API Java murni yang berfungsi pada sistem file utama di pasar.

Penerapan contoh dan cuplikan kode ini dapat ditemukan di GitHub.