השוואה בין getPath (), getAbsolutePath () ו- getCanonicalPath () ב- Java

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

ה java.io. קובץ בכיתה יש שלוש שיטות - getPath (), getAbsolutePath () ו getCanonicalPath () - כדי להשיג את נתיב מערכת הקבצים.

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

2. הגדרות שיטה ודוגמאות

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

| - baeldung | - baeldung.txt | - foo | | - foo-one.txt | \ - foo-two.txt \ - בר | - bar-one.txt | - bar-two.txt \ - baz | - baz-one.txt \ - baz-two.txt

2.1. getPath ()

פשוט שים, getPath () מחזירה את חוּט ייצוג של שם הנתיב המופשט של הקובץ. זה בעצם שם הנתיב שהועבר ל קוֹבֶץ בַּנַאִי.

אז אם קוֹבֶץ האובייקט נוצר באמצעות נתיב יחסי, הערך שהוחזר מ getPath () שיטה תהיה גם דרך יחסית.

אם נפעיל את הקוד הבא מה- {user.home} / baeldung מַדרִיך:

קובץ קובץ = קובץ חדש ("foo / foo-one.txt"); נתיב מחרוזת = file.getPath ();

ה נָתִיב למשתנה יהיה הערך:

foo / foo-one.txt // במערכות יוניקס foo \ foo-one.txt // במערכות Windows

שים לב כי עבור מערכת Windows, תו מפריד השמות השתנה מהתו קו נטוי קדימה (/), שהועבר לבנאי, לתו backslash (\). זה בגלל ש השבים חוּט משתמש תמיד בתו המפריד בין שמות ברירת המחדל לפלטפורמה.

2.2. getAbsolutePath ()

ה getAbsolutePath () השיטה מחזירה שם הנתיב של הקובץ לאחר פתרון הנתיב לספריית המשתמש הנוכחית - זה נקרא שם נתיב מוחלט. אז, לדוגמא הקודמת שלנו, file.getAbsolutePath () יחזור:

/home/username/baeldung/foo/foo-one.txt // במערכות יוניקס C: \ Users \ username \ baeldung \ foo \ foo-one.txt // במערכות Windows

שיטה זו פותרת רק את הספריה הנוכחית עבור נתיב יחסי. ייצוגים קצרים (כגון ".” ו"..”) לא נפתרים עוד יותר. מכאן שכשאנחנו מבצעים את הקוד הבא מהספריה {user.home} / baeldung:

קובץ קובץ = קובץ חדש ("bar / baz /../ bar-one.txt"); נתיב מחרוזת = file.getAbsolutePath ();

ערך המשתנה נָתִיב יהיה:

/home/username/baeldung/bar/baz/../bar-one.txt // במערכות Unix C: \ Users \ username \ baeldung \ bar \ baz \ .. \ bar-one.txt // במערכות Windows

2.3. getCanonicalPath ()

ה getCanonicalPath () השיטה הולכת צעד קדימה ו פותר את שם הנתיב המוחלט, כמו גם את השורטטים או השמות המיותרים כמו "."ו".. לפי מבנה הספריה. זה גם פותר קישורים סימבוליים על מערכות יוניקס ו ממיר את אות הכונן למקרה רגיל במערכות חלונות.

אז לדוגמא הקודמת, getCanonicalPath () השיטה תחזור:

/home/username/baeldung/bar/bar-one.txt // במערכות יוניקס C: \ Users \ username \ baeldung \ bar \ bar-one.txt // במערכות Windows

ניקח דוגמא נוספת. ניתן לספרייה הנוכחית כ- $ {user.home} / baeldung ו קוֹבֶץ אובייקט שנוצר באמצעות הפרמטר קובץ חדש ("bar / baz /./ baz-one.txt"), הפלט עבור getCanonicalPath () יהיה:

/home/username/baeldung/bar/baz/baz-one.txt // במערכות יוניקס C: \ משתמשים \ שם משתמש \ baeldung \ bar \ baz \ baz-one.txt // במערכות Windows

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

בניגוד לשתי השיטות האחרונות, getCanonicalPath () עשוי לזרוק IOException כי זה דורש שאילתות של מערכת קבצים.

לדוגמא, במערכות Windows, אם ניצור א קוֹבֶץ חפץ עם אחת הדמויות הבלתי חוקיות, פתרון הנתיב הקנוני יזרוק IOException:

קובץ חדש ("*"). getCanonicalPath ();

3. שימוש במקרה

נניח שאנחנו כותבים שיטה שלוקחת א קוֹבֶץ אובייקט כפרמטר ושומר את שמו המלא במאגר. איננו יודעים אם הנתיב יחסי או מכיל קיצורי דרך. במקרה זה, נרצה להשתמש getCanonicalPath ().

עם זאת, מאז getCanonicalPath () קורא את מערכת הקבצים, זה כרוך בעלות ביצועים. אם אנו בטוחים כי אין שמות מיותרים או קישורים סימבוליים ותיק אותיות כונן הוא סטנדרטי (אם משתמשים במערכת הפעלה של Windows), עלינו להעדיף להשתמש getAbsoultePath ().

4. מסקנה

במדריך מהיר זה סקרנו את ההבדלים בין השלושה קוֹבֶץ שיטות להשיג נתיב מערכת קבצים. הראינו גם מקרה שימוש בו ניתן להעדיף שיטה אחת על פני אחרת.

א ג'וניט ניתן למצוא כיתת מבחן המדגימה את הדוגמאות של מאמר זה באתר GitHub.