צור קישור סמלי עם Java

1. סקירה כללית

במדריך זה נחקור דרכים שונות ליצירת קישור סמלי בג'אווה באמצעות NIO.2 API ונחקור את ההבדלים בין קישורי קבצים קשים ורכים.

2. קישורים קשים לעומת רכים / סמלים

ראשית, בואו נגדיר מהן קישורי קבצים ומה ההתנהגות הצפויה שלהם. קישור לקובץ הוא מצביע שמפנה בשקיפות לקובץ המאוחסן במערכת הקבצים.

אי הבנה שכיחה היא לחשוב שקישור לקובץ הוא קיצור דרך, אז בואו נבדוק את התנהגותם:

  • קיצור דרך הוא קובץ רגיל המפנה לקובץ יעד
  • קישור רך / סמלי הוא מצביע קובץ שמתנהג כקובץ המקשר אליו - אם קובץ היעד נמחק הקישור אינו שמיש
  • קישור קשיח הוא מצביע קובץ המשקף את הקובץ שאליו הוא מקשר, כך שהוא בעצם כמו שיבוט. אם קובץ היעד נמחק, קובץ הקישור עדיין תקף

רוב מערכות ההפעלה (לינוקס, חלונות, מק) כבר תומכות בקישורי קבצים רכים / קשים, ולכן לא אמורה להיות בעיה לעבוד עליהם באמצעות NIO API.

3. יצירת קישורים

ראשית, עלינו ליצור קובץ יעד לקישור אליו, אז בואו נרדף כמה נתונים לקובץ:

נתיב ציבורי createTextFile () זורק IOException {byte [] content = IntStream.range (0, 10000) .mapToObj (i -> i + System.lineSeparator ()) .reduce ("", String :: concat) .getBytes (StandardCharsets) .UTF_8); נתיב filePath = Paths.get ("", "target_link.txt"); Files.write (filePath, content, CREATE, TRUNCATE_EXISTING); להחזיר filePath; } 

בואו ניצור קישור סמלי לקובץ קיים, ונדאג שהקובץ שנוצר הוא קישור סמלי:

חלל ציבורי createSymbolicLink () זורק IOException {נתיב יעד = createTextFile (); קישור נתיב = Paths.get (".", "Symbolic_link.txt"); אם (Files.exists (קישור)) {Files.delete (קישור); } Files.createSymbolicLink (קישור, יעד); } 

לאחר מכן, בואו נסתכל על יצירת קישורים קשים:

חלל ציבורי createHardLink () זורק IOException {נתיב יעד = createTextFile (); קישור נתיב = Paths.get (".", "Hard_link.txt"); אם (Files.exists (קישור)) {Files.delete (קישור); } Files.createLink (קישור, מטרה); } 

על ידי רישום הקבצים עם ההבדלים ביניהם, אנו יכולים לראות שגודל קובץ הקישור הרך / סמלי קטן, ואילו הקישור הקשיח משתמש באותו שטח כמו הקובץ המקושר:

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

כדי להבין בבירור מהם החריגים האפשריים שניתן לזרוק, בואו נראה את החריגים המסומנים על הפעולות:

  • לא נתמךOperationException - כאשר ה- JVM אינו תומך בקישורי קבצים במערכת ספציפית
  • FileAlreadyExistsException - כאשר קובץ הקישור כבר קיים, המעקף אינו נתמך כברירת מחדל
  • IOException - כאשר מתרחשת שגיאת IO, למשל נתיב קבצים לא חוקי
  • ExceptionException - כאשר לא ניתן ליצור את קובץ הקישור או שלא ניתן לגשת לקובץ היעד בגלל הרשאות קבצים מוגבלות

4. פעולות עם קישורים

כעת, אם יש לנו מערכת קבצים נתונה עם קישורי קבצים קיימים, ניתן לזהות אותם ולהראות את קבצי היעד שלהם:

חלל ציבורי printLinkFiles (נתיב נתיב) זורק את IOException {try (DirectoryStream stream = Files.newDirectoryStream (path)) {for (file file: stream) {if (Files.isDirectory (file)) {printLinkFiles (file); } אחר אם (Files.isSymbolicLink (קובץ)) {System.out.format ("קישור הקובץ '% s' עם היעד '% s'% n", קובץ, Files.readSymbolicLink (קובץ)); }}}} 

אם אנו מבצעים זאת בדרכנו הנוכחית:

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

היינו מקבלים את התפוקה:

קישור הקובץ 'symbolic_link.txt' עם היעד 'target_link.txt' 

שים לב שקבצי קישור קשיח אינם ניתנים לזיהוי פשוט עם ממשק ה- API של NIO, פעולות ברמה נמוכה נדרשות לעבוד על סוג זה של קבצים.

5. מסקנה

מאמר זה מתאר את הסוג השונה של קישורי קבצים, ההבדל ביניהם עם קיצורי דרך, וכיצד ליצור ולפעול עליהם באמצעות ממשק API טהור של Java שעובד על מערכות הקבצים המיינסטרים בשוק.

היישום של דוגמאות אלה וקטעי קוד ניתן למצוא באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found