כיצד להעתיק קובץ עם Java

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

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

ראשית, נשתמש בתקן IO ו NIO.2 ממשקי API ושתי ספריות חיצוניות: commons-io וגויאבה.

2. IO API (לפני JDK7)

ראשית כל, ללהעתיק קובץ עם java.io ממשק API, אנו נדרשים לפתוח זרם, לעבור על התוכן ולכתוב אותו לזרם אחר:

@Test ציבורי בטל givenIoAPI_whenCopied_thenCopyExistsWithSameContents () זורק IOException {קובץ מועתק = קובץ חדש ("src / test / resources / copiedWithIo.txt"); נסה (InputStream in = BufferedInputStream חדש (FileInputStream חדש (מקורי)); OutputStream out = BufferedOutputStream חדש (FileOutputStream חדש (הועתק))) {byte [] buffer = byte new [1024]; אורך int קריאה; בעוד ((lengthRead = in.read (buffer))> 0) {out.write (buffer, 0, lengthRead); out.flush (); }} assertThat (מועתק). קיים (); assertThat (Files.readAllLines (original.toPath ()). שווים (Files.readAllLines (copied.toPath ()))); }

די הרבה עבודה ליישום פונקציונליות בסיסית שכזו.

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

3. NIO.2 API (JDK7)

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

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

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

ניתן לשנות התנהגות זו באמצעות אפשרויות ההעתקה הבאות:

  • REPLACE_EXISTING - החלף קובץ אם הוא קיים
  • COPY_ATTRIBUTES - העתק מטא נתונים לקובץ החדש
  • NOFOLLOW_LINKS - לא צריך לעקוב אחר קישורים סימבוליים

ה קבצי NIO.2 מחלקה מספקת קבוצה של עומס יתר עותק() שיטות להעתקת קבצים וספריות בתוך מערכת הקבצים.

בואו נסתכל על דוגמה באמצעות עותק() עם שתיים נָתִיב טיעונים:

@Test ציבורי בטל נתון NIO2_whenCopied_thenCopyExistsWithSameContents () זורק IOException {Path copied = Paths.get ("src / test / resources / copiedWithNio.txt"); נתיב originalPath = original.toPath (); Files.copy (originalPath, מועתק, StandardCopyOption.REPLACE_EXISTING); assertThat (מועתק). קיים (); assertThat (Files.readAllLines (originalPath) .equals (Files.readAllLines (מועתק))); }

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

4. Apache Commons IO

דרך נפוצה נוספת להעתיק קובץ עם Java היא באמצעות ה- commons-io סִפְרִיָה.

ראשית, עלינו להוסיף את התלות:

 commons-io commons-io 2.6 

ניתן להוריד את הגרסה האחרונה מ Maven Central.

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

בואו נסתכל על מבחן JUnit באמצעות ה- copyFile () שיטה:

@Test הציבור בטל givenCommonsIoAPI_whenCopied_thenCopyExistsWithSameContents () זורק IOException {File copied = new File ("src / test / resources / copiedWithApacheCommons.txt"); FileUtils.copyFile (מקורי, מועתק); assertThat (מועתק). קיים (); assertThat (Files.readAllLines (original.toPath ()). שווים (Files.readAllLines (copied.toPath ()))); }

5. גויאבה

לבסוף, נסתכל על ספריית גויאבה של גוגל.

שוב, אם אנחנו רוצים להשתמש בגויאבה, עלינו לכלול את התלות:

 com.google.guava גויאבה 23.0 

ניתן למצוא את הגרסה האחרונה ב- Maven Central.

והנה הדרך של הגויאבה להעתיק קובץ:

@Test ציבורי בטל givenGuava_whenCopied_thenCopyExistsWithSameContents () זורק IOException {File copied = new File ("src / test / resources / copiedWithGuava.txt"); com.google.common.io.Files.copy (מקורי, מועתק); assertThat (מועתק). קיים (); assertThat (Files.readAllLines (original.toPath ()). שווים (Files.readAllLines (copied.toPath ()))); }

6. מסקנה

במאמר זה בחנו את הדרכים הנפוצות ביותר להעתקת קובץ ב- Java.

היישום המלא של מאמר זה ניתן למצוא באתר Github.


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