Čítanie riadku na danom čísle riadku zo súboru v Jave
1. Prehľad
V tomto rýchlom článku sa pozrieme na rôzne spôsoby čítania riadku s daným číslom riadku v súbore.
2. Vstupný súbor
Začnime vytvorením jednoduchého súboru s názvom inputLines.txt ktoré použijeme vo všetkých našich príkladoch:
Riadok 1 Riadok 2 Riadok 3 Riadok 4 Riadok 5
3. Používanie BufferedReader
Pozrime sa na dobre známe BufferedReader triedy a jej výhoda neuloženia celého súboru do pamäte.
Môžeme prečítať súbor po riadku a zastaviť, keď chceme:
@Test public void givenFile_whenUsingBufferedReader_thenExtractedLineIsCorrect () {try (BufferedReader br = Files.newBufferedReader (Paths.get (FILE_PATH))) {for (int i = 0; i <3; i ++) {br.readLine (); } Reťazec extrahovanýRiadok = br.readLine (); assertEquals ("riadok 4", extrahovaný riadok); }}
4. Používanie Skener
Ďalším podobným prístupom, ktorý môžeme zvoliť, je použitie a Skener:
@Test public void givenFile_whenUsingScanner_thenExtractedLineIsCorrect () {try (Scanner scanner = new Scanner (new File (FILE_PATH)))) {for (int i = 0; i <3; i ++) {scanner.nextLine (); } Reťazec extrahovanýRiadok = scanner.nextLine (); assertEquals ("riadok 4", extrahovaný riadok); }}
Aj keď na malých súboroch, rozdiel medzi BufferedReader a Skener nemusí byť viditeľný, na väčších súboroch Skener bude pomalší, pretože tiež analyzuje a má menšiu veľkosť vyrovnávacej pamäte.
5. Používanie File API
5.1. Malé súbory
Môžeme použiť Files.readAllLines () z File API na ľahké načítanie obsahu súboru do pamäte a extrahovanie požadovaného riadku:
@Test public void givenSmallFile_whenUsingFilesAPI_thenExtractedLineIsCorrect () {String extrahovanýLine = Files.readAllLines (Paths.get (FILE_PATH)). Get (4); assertEquals ("Riadok 5", extrahovaný riadok); }
5.2. Veľké súbory
Ak potrebujeme pracovať s veľkými súbormi, mali by sme použiť riadky metóda, ktorá vráti a Prúd aby sme mohli čítať súbor po riadkoch:
@Test public void givenLargeFile_whenUsingFilesAPI_thenExtractedLineIsCorrect () {try (Stream lines = Files.lines (Paths.get (FILE_PATH))) {String extrahovanýLine = lines.skip (4) .findFirst (). Get (); assertEquals ("Riadok 5", extrahovaný riadok); }}
6. Používanie Apache Commons IO
Ďalšou možnosťou je použitie FileUtils trieda commons-io balíček, ktorý načíta celý súbor a vráti riadky ako zoznam Strings:
@ Test public void givenFile_whenUsingFileUtils_thenExtractedLineIsCorrect () {ClassLoader classLoader = getClass (). GetClassLoader (); Súbor file = nový File (classLoader.getResource ("linesInput.txt"). GetFile ()); Zoznam riadkov = FileUtils.readLines (súbor, "UTF-8"); Reťazec extrahovanýRiadok = lines.get (0); assertEquals ("riadok 1", extrahovaný riadok); }
Môžeme tiež použiť IOUtils triedy na dosiahnutie rovnakého výsledku, okrem tohto času sa však celý obsah vráti ako a String, a musíme si rozdelenie urobiť sami:
@Test public void givenFile_whenUsingIOUtils_thenExtractedLineIsCorrect () {String fileContent = IOUtils.toString (nový FileInputStream (FILE_PATH), StandardCharsets.UTF_8); Reťazec extrahovanýLine = fileContent.split (System.lineSeparator ()) [0]; assertEquals ("riadok 1", extrahovaný riadok); }
7. Záver
V tomto rýchlom článku sme sa oboznámili s najbežnejšími spôsobmi čítania riadku zo súboru so zadaným číslom riadku.
Ako obvykle sú príklady k dispozícii na GitHub.