מצא את מספר השורות בקובץ באמצעות Java

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

במדריך זה נלמד כיצד למצוא את מספר השורות בקובץ באמצעות Java בעזרת ממשקי API של Java IO סטנדרטיים, גוגל גואבא ו Apache Commons IO סִפְרִיָה.

2. NIO2 קבצים

שים לב שבמהלך הדרכה זו נשתמש בערכי הדוגמה הבאים כשם קובץ הקלט ומספר השורות הכולל:

סופי סטטי מחרוזת INPUT_FILE_NAME = "src / main / resources / input.txt"; סופי סטטי int NO_OF_LINES = 45; 

Java 7 הציגה שיפורים רבים בספריות ה- IO הקיימות וארזה אותה תחת NIO2:

בוא נתחיל עם קבצים ונראה כיצד נוכל להשתמש ב- API שלו כדי לספור את מספר השורות:

@ מבחן ציבורי בטל כאשר משתמשNIOFiles_thenReturnTotalNumberOfLines () זורק IOException {נסה (זרם fileStream = Files.lines (Paths.get (INPUT_FILE_NAME))) {int noOfLines = (int) fileStream.count (); assertEquals (NO_OF_LINES, noOfLines); }}

או פשוט באמצעות קבצים # readAllLines שיטה:

@ מבחן ציבורי בטל כאשר שימושNIOFilesReadAllLines_thenReturnTotalNumberOfLines () זורק IOException {List fileStream = Files.readAllLines (Paths.get (INPUT_FILE_NAME)); int noOfLines = fileStream.size (); assertEquals (NO_OF_LINES, noOfLines); }

3. NIO FileChannel

עכשיו בואו נבדוק FileChannel, חלופת Java NIO עם ביצועים גבוהים לקריאת מספר השורות:

@Test ציבורי בטל כאשרUsingNIOFileChannel_thenReturnTotalNumberOfLines () זורק IOException {int noOfLines = 1; נסה (FileChannel channel = FileChannel.open (Paths.get (INPUT_FILE_NAME), StandardOpenOption.READ)) {ByteBuffer byteBuffer = channel.map (MapMode.READ_ONLY, 0, channel.size ()); בעוד (byteBuffer.hasRemaining ()) {byte currentByte = byteBuffer.get (); אם (currentByte == '\ n') noOfLines ++; }} assertEquals (NO_OF_LINES, noOfLines); }

דרך ה FileChannel הוצג ב- JDK 4, הפתרון שלעיל עובד רק עם JDK 7 ומעלה.

4. גויאבה של גוגל קבצים

ספרייה חלופית של צד שלישי תהיה Google Guava קבצים מעמד. ניתן להשתמש במחלקה זו גם כדי לספור את מספר השורות הכולל באופן דומה למה שראינו איתו קבצים # readAllLines.

נתחיל בהוספת ה- גויאבה תלות שלנו pom.xml:

 com.google.guava גויאבה 28.0-jre 

ואז נוכל להשתמש readLines לקבל רשימה של שורות קבצים:

@ מבחן ציבורי בטל כאשר משתמש ב- GoogleGuava_thenReturnTotalNumberOfLines () זורק IOException {List lineItems = Files.readLines (Paths.get (INPUT_FILE_NAME) .toFile (), Charset.defaultCharset ()); int noOfLines = lineItems.size (); assertEquals (NO_OF_LINES, noOfLines); }

5. Apache Commons IO FileUtils

עכשיו בואו נראה את Apache Commons IO FileUtils API, פיתרון מקביל לגויאבה.

כדי להשתמש בספרייה, עלינו לכלול את התלות commons-io ב- pom.xml:

 commons-io commons-io 2.6 

בשלב זה אנו יכולים להשתמש ב- IO של Apache Commons FileUtils # lineIterator, שמנקה עבורנו חלק מתיקי הקבצים:

@ מבחן ציבורי בטל כאשרUsingApacheCommonsIO_thenReturnTotalNumberOfLines () זורק IOException {int noOfLines = 0; LineIterator lineIterator = FileUtils.lineIterator (קובץ חדש (INPUT_FILE_NAME)); בעוד (lineIterator.hasNext ()) {lineIterator.nextLine (); noOfLines ++; } assertEquals (NO_OF_LINES, noOfLines); }

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

6. BufferedReader

אז מה עם דרכי בית הספר הישן? אם איננו משתמשים ב- JDK 7 ואיננו יכולים להשתמש בספריית צד שלישי, כן BufferedReader:

@ מבחן פומבי בטל כאשר UsBBufferedReader_thenReturnTotalNumberOfLines () זורק IOException {int noOfLines = 0; נסה (BufferedReader reader = חדש BufferedReader (FileReader חדש (INPUT_FILE_NAME))) {while (reader.readLine ()! = null) {noOfLines ++; }} assertEquals (NO_OF_LINES, noOfLines); }

7. LineNumberReader

לחלופין, נוכל להשתמש LineNumberReader, תת מחלקה ישירה של BufferedReader, שזה רק קצת פחות מילולי:

@Test ציבורי בטל כאשרUsingLineNumberReader_thenReturnTotalNumberOfLines () זורק IOException {try (LineNumberReader reader = new LineNumberReader (FileReader new (INPUT_FILE_NAME))) {reader.skip (Integer.MAX_VALUE); int noOfLines = reader.getLineNumber () + 1; assertEquals (NO_OF_LINES, noOfLines); }}

הנה אנחנו קורא ל לדלג שיטה לעבור לסוף הקובץ, ו אנו מוסיפים 1 למספר השורות הכולל נספר מאז שמספור השורות מתחיל ב 0.

8. סוֹרֵק

ולבסוף, אם אנחנו כבר משתמשים סוֹרֵק כחלק מפתרון גדול יותר, זה יכול לפתור את הבעיה גם עבורנו:

@ מבחן ציבורי בטל כאשר משתמש ב- Scanner_thenReturnTotalNumberOfLines () זורק IOException {try (Scanner scanner = new Scanner (new FileReader (INPUT_FILE_NAME))) {int noOfLines = 0; בעוד (scanner.hasNextLine ()) {scanner.nextLine (); noOfLines ++; } assertEquals (NO_OF_LINES, noOfLines); }}

9. מסקנה

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

כמו תמיד, קוד המקור של הדרכה זו זמין ב- GitHub.


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