Java - גודל הספריה

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

במדריך זה - נלמד כיצד להשיג את גודל התיקיה בג'אווה - שימוש ב- Java 6, 7 וב- Java 8 החדש וכן ב- Guava ו- Apache Common IO.

לבסוף - נקבל גם ייצוג קריא אנושי של גודל הספריה.

2. עם ג'אווה

נתחיל בדוגמה פשוטה לחישוב גודל התיקיה - תוך שימוש בסכום תכולתו:

פרטי ארוך getFolderSize (תיקיית קובץ) {long length = 0; קובץ [] קבצים = folder.listFiles (); int count = files.length; עבור (int i = 0; i <count; i ++) {if (files [i] .isFile ()) {length + = files [i] .length (); } אחר {length + = getFolderSize (קבצים [i]); }} אורך החזרה; }

אנחנו יכולים לבדוק את השיטה שלנו getFolderSize () כמו בדוגמה הבאה:

@ מבחן ציבורי בטל כאשר GetFolderSizeRecursive_thenCorrect () {long expectSize = 12607; תיקיית קבצים = קובץ חדש ("src / test / resources"); גודל ארוך = getFolderSize (תיקיה); assertEquals (expectSize, size); }

הערה: listFiles () משמש לרשימת תוכן התיקיה הנתונה.

3. עם Java 7

הבא - בואו נראה כיצד להשתמש Java 7 כדי לקבל את גודל התיקיה. בדוגמה הבאה - אנו משתמשים Files.walkFileTree () לחצות את כל הקבצים בתיקיה לסיכום גודלם:

@Test ציבורי בטל כאשר GetFolderSizeUsingJava7_thenCorrect () זורק IOException {long expectedSize = 12607; גודל AtomicLong = AtomicLong חדש (0); תיקיית נתיב = Paths.get ("src / test / resources"); Files.walkFileTree (תיקיה, SimpleFileVisitor חדש () {@Override ציבורי FileVisitResult visitFile (קובץ נתיב, תכונות BasicFileAttributes) זורק IOException {size.addAndGet (attrs.size ()); להחזיר FileVisitResult.CONTINUE;}}); assertEquals (expectSize, size.longValue ()); }

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

4. עם Java 8

עכשיו - בואו נראה איך להשיג את גודל התיקיה באמצעות Java 8, פעולות זרם ולמבדות. בדוגמה הבאה - אנו משתמשים Files.walk () לחצות את כל הקבצים בתיקיה לסיכום גודלם:

@Test ציבורי בטל כאשר GetFolderSizeUsingJava8_thenCorrect () זורק IOException {long expectedSize = 12607; תיקיית נתיב = Paths.get ("src / test / resources"); גודל ארוך = Files.walk (תיקייה) .filter (p -> p.toFile (). isFile ()) .mapToLong (p -> p.toFile (). אורך ()). sum (); assertEquals (expectSize, size); }

הערה: mapToLong () משמש ליצירת a לונגסטרים על ידי יישום ה- אורך לתפקד בכל אלמנט - אחריו אנו יכולים סְכוּם ולקבל תוצאה סופית.

5. עם Apache Commons IO

הבא - בואו נראה איך להשיג את גודל התיקיה באמצעות Apache Commons IO. בדוגמה הבאה - אנחנו פשוט משתמשים FileUtils.sizeOfDirectory () כדי לקבל את גודל התיקיה:

@ מבחן ציבורי בטל כאשר GetFolderSizeUsingApacheCommonsIO_thenCorrect () {long expectSSize = 12607; תיקיית קבצים = קובץ חדש ("src / test / resources"); גודל ארוך = FileUtils.sizeOfDirectory (תיקיה); assertEquals (expectSize, size); }

שים לב כי שיטת השירות הכללית הזו מיישמת פתרון Java 6 פשוט מתחת למכסה המנוע.

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

6. עם גויאבה

עכשיו - בואו נראה איך מחשבים את גודל התיקיה באמצעות גויאבה. בדוגמה הבאה - אנו משתמשים Files.fileTreeTraverser () לחצות את כל הקבצים בתיקיה לסיכום גודלם:

@Test ציבורי בטל whenGetFolderSizeUsingGuava_thenCorrect () {long expectSize = 12607; תיקיית קבצים = קובץ חדש ("src / test / resources"); קבצים ניתנים לשינוי = Files.fileTraverser (). BreadthFirst (תיקיה); גודל ארוך = StreamSupport.stream (files.spliterator (), false) .filter (f -> f.isFile ()) .mapToLong (File :: length) .sum (); assertEquals (expectSize, size); }

7. גודל קריא לאדם

לסיום - בואו נראה כיצד להשיג ייצוג קריא יותר של המשתמש לגודל התיקיה - לא רק לגודל בתים:

@ מבחן ציבורי בטל כאשר GetReadableSize_thenCorrect () {תיקיית קובץ = קובץ חדש ("src / test / resources"); גודל ארוך = getFolderSize (תיקיה); מחרוזת [] יחידות = מחרוזת חדשה [] {"B", "KB", "MB", "GB", "TB"}; int unitIndex = (int) (Math.log10 (size) / 3); יחידה כפולה ערך = 1 << (unitIndex * 10); מחרוזת readableSize = חדש DecimalFormat ("#, ## 0. #"). פורמט (size / unitValue) + "" + יחידות [unitIndex]; assertEquals ("12.3 KB", readableSize); }

הערה: השתמשנו DecimalFormat ("#, ## 0, #") לעגל את התוצאה למקום עשרוני אחד.

8. הערות

הנה כמה הערות לגבי חישוב גודל התיקיה:

  • שניהם Files.walk () ו Files.walkFileTree () יזרוק אבטחת אבטחה אם מנהל האבטחה שולל גישה לקובץ ההתחלה.
  • הלולאה האינסופית עשויה להתרחש אם התיקיה מכילה קישורים סמלים.

9. מסקנה

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

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


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