קבצי Java פתיחת אפשרויות
1. סקירה כללית
במדריך זה אנו נתמקד באפשרויות הפתיחה הסטנדרטיות הזמינות לקבצים ב- Java.
נחקור את אפשרות אופטימלית enum המיישם את OpenOption ממשק וזה מגדיר את האפשרויות הפתוחות הסטנדרטיות הללו.
2. ה OpenOption פָּרָמֶטֶר
בג'אווה נוכל לעבוד עם קבצים באמצעות NIO2 API, המכיל מספר שיטות עזר. חלק משיטות אלה משתמשות באופציה OpenOption פרמטר שמגדיר כיצד לפתוח או ליצור קובץ. בנוסף, לפרמטר זה יהיה ערך ברירת מחדל אם הוא לא מוגדר, אשר יכול להיות שונה לכל אחת משיטות אלה.
ה אפשרות אופטימלית סוג enum מגדיר את האפשרויות הסטנדרטיות ומיישם את OpenOption מִמְשָׁק.
הנה רשימת האפשרויות הנתמכות שבהן אנו יכולים להשתמש עם ה- StandardOpenOptions enum:
- לִכתוֹב: פותח את הקובץ לגישה לכתיבה
- לְצַרֵף: מוסיף כמה נתונים לקובץ
- TRUNCATE_EXISTING: מקצץ את הקובץ
- צור חדש: יוצר קובץ חדש וזורק חריג אם הקובץ כבר קיים
- לִיצוֹר: פותח את הקובץ אם הוא קיים או יוצר קובץ חדש אם לא
- DELETE_ON_CLOSE: מוחק את הקובץ לאחר סגירת הזרם
- דליל: הקובץ החדש שנוצר יהיה דליל
- סינכרון: שומר על התוכן ומטא הנתונים של הקובץ המסונכרן
- DSYNC: שומר רק על תוכן הקובץ המסונכרן
בחלקים הבאים נראה דוגמאות כיצד להשתמש בכל אחת מהאפשרויות הללו.
כדי למנוע בלבול בנתיב הקובץ, בואו ונטפל בספריית הבית של המשתמש, אשר תהיה תקפה בכל מערכות ההפעלה:
מחרוזת סטטית פרטית HOME = System.getProperty ("user.home");
3. פתיחת קובץ לקריאה וכתיבה
ראשית, אם אנחנו רוצים כדי ליצור קובץ חדש אם הוא לא קיים נוכל להשתמש באפשרות לִיצוֹר:
@Test הציבור בטל שניתןExistingPath_whenCreateNewFile_thenCorrect () זורק IOException {assertFalse (Files.exists (Paths.get (HOME, "newfile.txt"))); Files.write (נתיב, DUMMY_TEXT.getBytes (), StandardOpenOption.CREATE); assertTrue (Files.exists (path)); }
אנו יכולים גם להשתמש באפשרות צור חדש, שייצור קובץ חדש אם הוא לא קיים.עם זאת, זה ישליך חריג אם הקובץ כבר קיים.
שנית, אם אנחנו רוצים כדי לפתוח את הקובץ לקריאה נוכל להשתמש ב- newInputStream (נתיב, OpenOption...) שיטה. שיטה זו פותחת את הקובץ לקריאה ומחזירה זרם קלט:
@Test הציבור בטל שניתןExistingPath_whenReadExistingFile_thenCorrect () זורק IOException {Path path = Paths.get (HOME, DUMMY_FILE_NAME); נסה (InputStream ב- = Files.newInputStream (נתיב); קורא BufferedReader = BufferedReader חדש (InputStreamReader חדש (ב))) {קו מחרוזת; בעוד ((line = reader.readLine ())! = null) {assertThat (line, CoreMatchers.containsString (DUMMY_TEXT)); }}}
שים לב איך לא השתמשנו באופציה לקרוא מכיוון שהוא משמש כברירת מחדל בשיטה newInputStream.
שְׁלִישִׁי, אנו יכולים ליצור קובץ, להוסיף לקובץ או לכתוב לקובץ באמצעות ה- newOutputStream (נתיב, OpenOption...) שיטה. שיטה זו פותחת או יוצרת קובץ לכתיבה ומחזירה קובץ OutputStream.
ה- API ייצור קובץ חדש אם לא נציין את האפשרויות הפתוחות והקובץ לא קיים. עם זאת, אם הקובץ קיים, הוא ייחתך. אפשרות זו דומה לקרוא לשיטה עם ה- לִיצוֹר ו TRUNCATE_EXISTING אפשרויות.
בואו נפתח קובץ קיים ונצרף כמה נתונים:
@Test הציבור בטל שניתןExistingPath_whenWriteToExistingFile_thenCorrect () זורק IOException {Path path = Paths.get (HOME, DUMMY_FILE_NAME); נסה (OutputStream out = Files.newOutputStream (נתיב, StandardOpenOption.APPEND, StandardOpenOption.WRITE)) {out.write (ANOTHER_DUMMY_TEXT.getBytes ()); }}
4. יצירת א דליל קוֹבֶץ
אנו יכולים לומר למערכת הקבצים שהקובץ החדש שנוצר צריך להיות דליל (קבצים המכילים רווחים ריקים שלא ייכתבו לדיסק).
לשם כך עלינו להשתמש באפשרות דליל עם ה צור חדש אוֹפְּצִיָה. למרות זאת, אפשרות זו תתעלם אם מערכת הקבצים אינה תומכת בקבצים דלילים.
בואו ניצור קובץ דליל:
@Test הציבור בטל שניתןExistingPath_whenCreateSparseFile_thenCorrect () זורק IOException {Path path = Paths.get (HOME, "sparse.txt"); Files.write (נתיב, DUMMY_TEXT.getBytes (), StandardOpenOption.CREATE_NEW, StandardOpenOption.SPARSE); }
5. שמירה על סנכרון הקובץ
ה StandardOpenOptions ל- enum יש סינכרון ו DSYNC אפשרויות. אפשרויות אלה מחייבות שנכתבים נתונים לקובץ באופן סינכרוני באחסון. במילים אחרות, אלה יבטיחו שהנתונים לא יאבדו במקרה של קריסת מערכת.
בואו נספח כמה נתונים לקובץ שלנו ונשתמש באפשרות סינכרון:
@Test הציבורי בטל שניתןExistingPath_whenWriteAndSync_thenCorrect () זורק IOException {Path path = Paths.get (HOME, DUMMY_FILE_NAME); Files.write (נתיב, ANOTHER_DUMMY_TEXT.getBytes (), StandardOpenOption.APPEND, StandardOpenOption.WRITE, StandardOpenOption.SYNC); }
ההבדל בין סינכרון ו DSYNC האם זה סינכרוןמאחסן את התוכן ואת המטא-נתונים של הקובץ באופן סינכרוני באחסון, בזמן DSYNC מאחסן רק את תוכן הקובץ באופן סינכרוני באחסון.
6. מחיקת הקובץ לאחר סגירת הזרם
ה StandardOpenOptions enum מציעה גם אפשרות שימושית שנותנת לנו את האפשרות להרוס את הקובץ לאחר סגירת הזרם. זה שימושי אם אנו רוצים ליצור קובץ זמני.
בואו נספח כמה נתונים לקובץ שלנו, ו השתמש באפשרות DELETE_ON_CLOSE:
@Test הציבור בטל שניתןExistingPath_whenDeleteOnClose_thenCorrect () זורק IOException {Path path = Paths.get (HOME, EXISTING_FILE_NAME); assertTrue (Files.exists (path)); הקובץ // כבר נוצר וקיים נסה (OutputStream out = Files.newOutputStream (נתיב, StandardOpenOption.APPEND, StandardOpenOption.WRITE, StandardOpenOption.DELETE_ON_CLOSE)) {out.write (ANOTHER_DUMMY_TEXT.getBytes ()); } assertFalse (Files.exists (path)); // הקובץ נמחק}
7. מסקנה
במדריך זה סקרנו את האפשרויות הזמינות לפתיחת קבצים ב- Java באמצעות ממשק הקבצים החדש API (NIO2) שנשלח כחלק מ- Java 7.
כרגיל, את קוד המקור עם כל הדוגמאות במדריך ניתן למצוא ב- Github.