קריאת שורה במספר שורה נתון מקובץ ב- Java

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

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

2. קובץ קלט

נתחיל ביצירת קובץ פשוט בשם inputLines.txt שנשתמש בכל הדוגמאות שלנו:

קו 1 קו 2 קו 3 קו 4 קו 5

3. שימוש BufferedReader

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

אנו יכולים לקרוא קובץ שורה אחר שורה ולעצור כשאנחנו רוצים:

@Test ציבורי בטל givenFile_whenUsingBufferedReader_thenExtractedLineIsCorrect () {try (BufferedReader br = Files.newBufferedReader (Paths.get (FILE_PATH)))) {for (int i = 0; i <3; i ++) {br.readLine (); } מחרוזת extractedLine = br.readLine (); assertEquals ("קו 4", extractedLine); }}

4. שימוש סוֹרֵק

גישה דומה נוספת שאנו יכולים לנקוט היא שימוש ב- סוֹרֵק:

@Test ציבורי בטל givenFile_whenUsingScanner_thenExtractedLineIsCorrect () {נסה (סורק סורק = סורק חדש (קובץ חדש (FILE_PATH))) {עבור (int i = 0; i <3; i ++) {scanner.nextLine (); } מחרוזת extractedLine = scanner.nextLine (); assertEquals ("קו 4", extractedLine); }}

אמנם על קבצים קטנים, ההבדל בין BufferedReader ו סוֹרֵק אולי לא מורגש בקבצים גדולים יותר סוֹרֵק יהיה איטי יותר מכיוון שהוא מבצע ניתוח גם ויש לו גודל חיץ קטן יותר.

5. שימוש ב- API של קובץ

5.1. קבצים קטנים

אנחנו יכולים להשתמש Files.readAllLines () מממשק ה- API כדי לקרוא בקלות את תוכן הקובץ בזיכרון ולחלץ את השורה הרצויה לנו:

@Test ציבורי בטל givenSmallFile_whenUsingFilesAPI_thenExtractedLineIsCorrect () {String extractedLine = Files.readAllLines (Paths.get (FILE_PATH)). Get (4); assertEquals ("קו 5", extractedLine); }

5.2. קבצים גדולים

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

@Test public void givenLargeFile_whenUsingFilesAPI_thenExtractedLineIsCorrect () {try (Stream lines = Files.lines (Paths.get (FILE_PATH))) {String extractedLine = lines.skip (4) .findFirst (). Get (); assertEquals ("קו 5", extractedLine); }}

6. שימוש ב- Apache Commons IO

אפשרות נוספת היא שימוש ב- FileUtils הכיתה של commons-io חבילה, שקוראת את כל הקובץ ומחזירה את השורות כרשימה של חוּטs:

@Test הציבור בטל givenFile_whenUsingFileUtils_thenExtractedLineIsCorrect () {ClassLoader classLoader = getClass (). GetClassLoader (); קובץ קובץ = קובץ חדש (classLoader.getResource ("linesInput.txt"). GetFile ()); שורות רשימה = FileUtils.readLines (קובץ, "UTF-8"); מחרוזת extractedLine = lines.get (0); assertEquals ("קו 1", extractedLine); }

אנחנו יכולים גם להשתמש ב- IOUtils בכיתה כדי להשיג את אותה התוצאה, למעט הפעם, כל התוכן מוחזר כ- חוּטועלינו לעשות את הפיצול בעצמנו:

@Test ציבורי בטל givenFile_whenUsingIOUtils_thenExtractedLineIsCorrect () {String fileContent = IOUtils.toString (FileInputStream חדש (FILE_PATH), StandardCharsets.UTF_8); מחרוזת extractedLine = fileContent.split (System.lineSeparator ()) [0]; assertEquals ("קו 1", extractedLine); }

7. מסקנה

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

כרגיל, הדוגמאות זמינות ב- GitHub.