כיצד להימנע מקבץ Java FileNotFoundException בעת טעינת משאבים

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

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

בואו נראה כיצד ג'אווה מאפשרת לנו לגשת לקבצי משאבים לאחר שקוד הארוז שלנו.

2. קריאת קבצים

נניח שהיישום שלנו קורא קובץ במהלך ההפעלה:

נסה (FileReader fileReader = FileReader חדש ("src / main / resources / input.txt"); BufferedReader reader = new BufferedReader (fileReader)) {String content = reader.lines () .collect (Collectors.joining (System.lineSeparator ( ))); }

אם אנו מריצים את הקוד הנ"ל ב- IDE, הקובץ נטען ללא שגיאה. זה בגלל ש IDE שלנו משתמש בספריית הפרויקטים שלנו כספריית העבודה הנוכחית שלה וה src / main / resources הספרייה נמצאת שם כדי לקרוא את היישום.

בואו נגיד שאנחנו משתמשים בתוסף Maven JAR כדי לארוז את הקוד שלנו כ- JAR.

כאשר אנו מריצים אותו בשורת הפקודה:

java -jar core-java-io2.jar

נראה את השגיאה הבאה:

חריג בשרשור "ראשי" java.io.FileNotFoundException: src / main / resources / input.txt (אין קובץ או ספרייה כאלה) ב- java.io.FileInputStream.open0 (שיטה מקורית) ב- java.io.FileInputStream.open (FileInputStream .java: 195) ב- java.io.FileInputStream. (FileInputStream.java:138) ב- java.io.FileInputStream. (FileInputStream.java:93) ב- java.io.FileReader. (FileReader.java:58) ב- com. baeldung.resource.MyResourceLoader.loadResourceWithReader (MyResourceLoader.java:14) ב- com.baeldung.resource.MyResourceLoader.main (MyResourceLoader.java:37)

3. קוד מקור לעומת קוד מקומפלד

כשאנחנו בונים JAR, המשאבים מוכנסים לספריית הבסיס של החפצים הארוזים.

בדוגמה שלנו אנו רואים את הגדרת קוד המקור input.txt ב src / main / resources בספריית קוד המקור שלנו.

במבנה ה- JAR המקביל, לעומת זאת, אנו רואים:

META-INF / MANIFEST.MF META-INF / com / com / baeldung / com / baeldung / resource / META-INF / maven / META-INF / maven / com.baeldung / META-INF / maven / com.baeldung / core -java-io-files / input.txt com / baeldung / resource / MyResourceLoader.class META-INF / maven / com.baeldung / core-java-io-files / pom.xml META-INF / maven / com.baeldung / core-java-io-files / pom.properties

פה, input.txt נמצא בספריית הבסיס של ה- JAR. אז כאשר הקוד יופעל, נראה את FileNotFoundException.

גם אם שינינו את הדרך ל /input.txt הקוד המקורי לא הצליח לטעון את הקובץ כ- בדרך כלל לא ניתן להתייחס למשאבים כקבצים בדיסק. קבצי המשאבים ארוזים בתוך ה- JAR ולכן אנו זקוקים לדרך גישה אחרת אליהם.

4. משאבים

בואו נשתמש בטעינת משאבים ל- טען משאבים ממסלול הכיתה במקום מיקום קבצים ספציפי. זה יעבוד ללא קשר לאופן שבו ארוז הקוד:

נסה (InputStream inputStream = getClass (). getResourceAsStream ("/ input.txt"); BufferedReader reader = new BufferedReader (InputStreamReader new (inputStream))) {String content = reader.lines () .collect (Collectors.joining (System.) lineSeparator ())); }

ClassLoader.getResourceAsStream () מסתכל על מסלול הכיתה של המשאב הנתון. הנטייה המובילה בקלט ל getResourceAsStream () אומר למטעין לקרוא מבסיס שביל הכיתה. תוכן קובץ ה- JAR שלנו נמצא על מסלול הכיתהאז שיטה זו עובדת.

IDE כולל בדרך כלל src / main / resources על מסלול הכיתה שלה וכך מוצא את הקבצים.

5. מסקנה

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

כמו תמיד, קוד הדוגמה זמין ב- GitHub.


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