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, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.