קריאת שורה במספר שורה נתון מקובץ ב- 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.