גש לקובץ מ- Classpath ביישום Spring

1. הקדמה

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

2. שימוש מַשׁאָב

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

נתחיל בבדיקת שיטות שונות להשגת א מַשׁאָב למשל.

2.1. באופן ידני

לגישה למשאב משביל הכיתה, אנו יכולים פשוט להשתמש בו ClassPathResource:

עומס משאבים ציבוריEmployeesWithClassPathResource () {החזר ClassPathResource חדש ("data / workers.dat"); }

כברירת מחדל, ClassPathResource מסיר מעט צלחת לבחירה לבחירה בין מעמיס הכיתת ההקשר של השרשור למעמיס המחדל של המערכת.

עם זאת, אנו יכולים גם לציין את ה- classloader שישמש ישירות:

להחזיר ClassPathResource חדש ("data / workers.dat", this.getClass (). getClassLoader ());

או בעקיפין באמצעות מחלקה מסוימת:

להחזיר ClassPathResource חדש ("data / workers.dat", Employee.class.getClassLoader ());

שים לב שמ- מַשׁאָבאנו יכולים לקפוץ בקלות לייצוגים סטנדרטיים של ג'אווה כמו InputStream אוֹ קוֹבֶץ.

דבר נוסף שיש לציין כאן הוא כי השיטה הנ"ל פועלת רק בשבילים מוחלטים. אם ברצונך לציין נתיב יחסי, תוכל לעבור שנייה מעמד טַעֲנָה. הנתיב יהיה יחסית למחלקה זו:

ClassPathResource חדש ("../../../ data / workers.dat", Example.class) .getFile ();

נתיב הקובץ שלמעלה הוא יחסית ל- דוגמא מעמד.

2.2. באמצעות @ערך

אנחנו יכולים גם להזריק א מַשׁאָב עם @ערך:

@Value ("classpath: data / resource-data.txt") Resource resourceFile;

וגם @ערך תומך גם בקידומות אחרות, כמו קוֹבֶץ: ו url:.

2.3. באמצעות ResourceLoader

לחלופין, אם אנו רוצים לטעון בעצלתיים את המשאב שלנו, נוכל להשתמש בו ResourceLoader:

@ ResourceLoader ResourceLoader @Autowired;

ואז אנו מאחזרים את המשאב שלנו באמצעות getResource:

עומס משאבים ציבוריEmployeesWithResourceLoader () {return resourceLoader.getResource ("classpath: data / workers.dat"); }

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

ApplicationContext הקשר; עומס משאבים ציבוריEmployeesWithApplicationContext () {return context.getResource ("classpath: data / workers.dat"); }

3. שימוש ResourceUtils

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

אם אנו רואים שימושים של ResourceUtils בקוד שלנו:

load file fileEmployeesWithSpringInternalClass () זורק FileNotFoundException {return ResourceUtils.getFile ("classpath: data / workers.dat"); }

עלינו לשקול היטב את הרציונל כ- עדיף להשתמש באחת הגישות הסטנדרטיות שלמעלה.

4. קריאת נתוני משאבים

ברגע שיש לנו מַשׁאָב, קל לנו לקרוא את התוכן. כפי שכבר דנו, אנו יכולים להשיג א קוֹבֶץ או InputStream התייחסות מה- מַשׁאָב.

בואו נדמיין שיש לנו את הקובץ הבא, נתונים / עובדים.דאט, על מסלול הכיתה:

עובד ג'ו, עובד Jan, James T. עובד

4.1. קריאה כ- קוֹבֶץ

כעת אנו יכולים לקרוא את תוכנו על ידי התקשרות getFile:

@ מבחן ציבורי בטל כאשר ResourceAsFile_thenReadSuccessful () זורק IOException {משאב קובץ = ClassPathResource חדש ("data / workers.dat"). GetFile (); מחרוזת עובדים = מחרוזת חדשה (Files.readAllBytes (resource.toPath ())); assertEquals ("עובד ג'ו, עובד Jan, James T. עובד", עובדים); }

אמנם, שים לב כי גישה זו מצפה מהמשאב להיות במערכת הקבצים ולא בתוך קובץ jar.

4.2. קריאה כ- InputStream

בואו נגיד, שהמשאב שלנו הוא בתוך צנצנת.

לאחר מכן נוכל לקרוא א מַשׁאָב כמו InputStream:

@ מבחן ציבורי בטל כאשר ResourceAsStream_thenReadSuccessful () זורק IOException {משאב InputStream = ClassPathResource חדש ("data / workers.dat"). GetInputStream (); נסה (BufferedReader reader = new BufferedReader (InputStreamReader new (resource))) {String workers = reader.lines () .collect (Collectors.joining ("\ n")); assertEquals ("עובד ג'ו, עובד Jan, James T. עובד", עובדים); }}

5. מסקנה

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

וכמו תמיד, פרסמתי את כל הדוגמאות האלה ב- GitHub.