שימוש ב- Java MappedByteBuffer

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

במאמר מהיר זה, נבחן את ה- MappedByteBuffer בתוך ה java.nio חֲבִילָה. כלי עזר זה יכול להיות די שימושי לקריאת קבצים יעילה.

2. איך MappedByteBuffer W.אורקים

כאשר אנו טוענים אזור של הקובץ, אנו יכולים לטעון אותו לאזור הזיכרון המסוים אליו ניתן לגשת מאוחר יותר.

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

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

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

3. קריאת הקובץ באמצעות MappedByteBuffer

בואו נגיד שיש לנו קובץ שנקרא fileToRead.txt עם התוכן הבא:

זהו תוכן הקובץ

הקובץ ממוקם ב- /מַשׁאָב הספרייה כדי שנוכל לטעון אותה באמצעות הפונקציה הבאה:

נתיב getFileURIFromResources (מחרוזת fileName) זורק חריג {ClassLoader classLoader = getClass (). GetClassLoader (); להחזיר את Paths.get (classLoader.getResource (fileName) .getPath ()); }

כדי ליצור את MappedByteBuffer מקובץ, ראשית עלינו ליצור FileChannel מזה. ברגע שנוצר את הערוץ שלנו, נוכל להפעיל את מַפָּה() שיטה על זה עובר ב MapMode, א עמדה שממנו אנו רוצים לקרוא, ואת גודל פרמטר המציין כמה בתים אנו רוצים:

CharBuffer charBuffer = null; נתיב pathToRead = getFileURIFromResources ("fileToRead.txt"); נסה (FileChannel fileChannel (FileChannel) Files.newByteChannel (pathToRead, EnumSet.of (StandardOpenOption.READ))) {MappedByteBuffer mappedByteBuffer = fileChannel .map (FileChannel.MapMode.READ_ONLY, 0, fileChannel.size); אם (mappedByteBuffer! = null) {charBuffer = Charset.forName ("UTF-8"). פענוח (mappedByteBuffer); }}

לאחר שמיפינו את הקובץ שלנו למאגר הממופה של הזיכרון, נוכל לקרוא את הנתונים ממנו אל ה- CharBuffer. חשוב לציין כי למרות שאנו קוראים את תוכן הקובץ כאשר אנו קוראים ל- לְפַעֲנֵחַ() העברת שיטה MappedByteBuffer, אנו קוראים מהזיכרון ולא מהדיסק. לכן קריאה זו תהיה מהירה מאוד.

אנו יכולים לטעון שתוכן שקראנו מהקובץ שלנו הוא התוכן האמיתי של ה- fileToRead.txt קוֹבֶץ:

assertNotNull (charBuffer); assertEquals (charBuffer.toString (), "זהו תוכן הקובץ");

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

4. כתיבה לקובץ באמצעות MappedByteBuffer

בואו נגיד שאנחנו רוצים לכתוב קצת תוכן לקובץ fileToWriteTo.txt משתמש ב MappedByteBuffer ממשק API. כדי להשיג זאת עלינו לפתוח את FileChannel ולקרוא ל מַפָּה() שיטה על זה, עובר ב FileChannel.MapMode.READ_WRITE.

לאחר מכן נוכל לשמור את תוכן ה- CharBuffer לתוך הקובץ באמצעות לָשִׂים() שיטה מה- MappedByteBuffer:

CharBuffer charBuffer = CharBuffer .wrap ("זה ייכתב לקובץ"); נתיב pathToWrite = getFileURIFromResources ("fileToWriteTo.txt"); נסה (FileChannel fileChannel = (FileChannel) קבצים. NewByteChannel (pathToWrite, EnumSet.of (StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING))) {MappedByteBuffer mappedByteBufferMode. קובץ קובץ. אורך()); אם (mappedByteBuffer! = null) {mappedByteBuffer.put (Charset.forName ("utf-8"). קידוד (charBuffer)); }}

אנו יכולים לטעון שהתוכן בפועל של charBuffer נכתב לקובץ על ידי קריאת התוכן שלו:

רשימת fileContent = Files.readAllLines (pathToWrite); assertEquals (fileContent.get (0), "זה ייכתב לקובץ");

5. מסקנה

במדריך מהיר זה, הסתכלנו על MappedByteBuffer לבנות מתוך java.nio חֲבִילָה.

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

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


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