Buat Pautan Simbolik dengan Java

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan meneroka pelbagai cara untuk membuat pautan simbolik di Java menggunakan NIO.2 API, dan meneroka perbezaan antara pautan fail keras dan lembut.

2. Pautan Keras vs Lembut / Simbolik

Pertama, mari kita tentukan apa pautan fail dan apakah tingkah laku yang diharapkan. Pautan fail adalah penunjuk yang merujuk secara telus fail yang disimpan dalam sistem fail .

Kesalahpahaman umum adalah memikirkan bahawa pautan fail adalah jalan pintas, jadi mari kita periksa kelakuan mereka:

  • Jalan pintas adalah fail biasa yang merujuk fail sasaran
  • Pautan lembut / Simbolik adalah penunjuk fail yang berperilaku sebagai fail yang dihubungkan - jika fail sasaran dihapus maka pautan tidak dapat digunakan
  • Pautan keras adalah penunjuk fail yang mencerminkan fail yang dihubungkan, jadi pada dasarnya seperti klon. Sekiranya fail sasaran dihapuskan, fail pautan masih berlaku

Sebilangan besar sistem operasi (Linux, Windows, Mac) sudah menyokong pautan fail lembut / keras, jadi seharusnya tidak menjadi masalah untuk mengatasinya menggunakan API NIO.

3. Membuat Pautan

Pertama, kita harus membuat fail sasaran untuk dihubungkan, jadi mari kita urutkan beberapa data ke dalam fail:

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 pautan simbolik ke fail yang ada, pastikan fail yang dibuat adalah pautan simbolik:

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

Seterusnya, mari kita lihat pembuatan pautan 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 menyenaraikan fail dengan perbezaannya, kita dapat melihat bahawa ukuran fail pautan lembut / simbolik kecil, sementara pautan keras menggunakan ruang yang sama dengan fail yang dipautkan:

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

Untuk memahami dengan jelas apa kemungkinan pengecualian yang dapat dilemparkan, mari kita lihat pengecualian yang diperiksa pada operasi:

  • UnsupportedOperationException - apabila JVM tidak menyokong pautan fail dalam sistem tertentu
  • FileAlreadyExistsException - apabila fail pautan sudah ada, penggantian tidak disokong secara lalai
  • IOException - apabila ralat IO berlaku, misalnya jalan fail yang tidak sah
  • SecurityException - apabila fail pautan tidak dapat dibuat atau fail sasaran tidak dapat diakses kerana izin fail yang terhad

4. Operasi Dengan Pautan

Sekarang, jika kita mempunyai sistem fail tertentu dengan pautan fail yang ada, ada kemungkinan untuk mengenalinya dan menunjukkan fail sasaran mereka:

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

Sekiranya kita melaksanakannya di jalan semasa kita:

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

Kami akan mendapat output:

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

Perhatikan bahawa fail pautan keras tidak dapat dikenali hanya dengan API NIO , operasi peringkat rendah diperlukan untuk mengatasi fail seperti itu.

5. Kesimpulan

Artikel ini menerangkan pelbagai jenis pautan fail, perbezaannya dengan jalan pintas, dan cara membuat dan mengoperasikannya menggunakan API Java murni yang berfungsi di atas sistem fail arus perdana di pasaran.

Pelaksanaan contoh dan coretan kod ini boleh didapati di GitHub.