Omówienie
W tym samouczku zbadamy różne sposoby czytania z pliku w Javie .
Najpierw nauczymy się, jak załadować plik ze ścieżki klas, adresu URL lub z pliku JAR przy użyciu standardowych klas Java.
Po drugie, zobaczymy, jak aby odczytać zawartość za pomocą BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream i FileChannel. Omówimy również, jak odczytać plik zakodowany w UTF-8.
Na koniec zbadamy nowe techniki ładowania i przeczytaj plik w Javie 7 i Java 8.
Ten artykuł jest częścią serii „Java – Back to Basic” w Baeldung.
Więcej informacji:
Java – Utwórz plik
Java – zapis do pliku
Konfiguracja
2.1 Plik wejściowy
W większości przykładów w tym artykule „przeczytamy plik tekstowy z nazwą pliku fileTest.txt, który zawiera jeden wiersz:
W kilku przykładach użyjemy innego pliku; w takich przypadkach wyraźnie wspomnimy o pliku i jego zawartości.
2.2 Metoda pomocnicza
Użyjemy zestawu przykładów testowych z rdzeniem Tylko klasy Java, aw testach będziemy używać asercji z dopasowującymi Hamcrest.
Testy będą korzystać ze wspólnej metody readFromInputStream, która przekształca InputStream na String w celu łatwiejszego potwierdzenia wyników:
Zwróć uwagę, że istnieją inne sposoby osiągnięcia tego samego rezultatu. Możemy zapoznać się z tym artykułem, aby uzyskać alternatywne informacje.
Czytanie pliku z Classpath
3.1 . Używanie standardowej Javy
Ta sekcja wyjaśnia, jak czytać plik dostępny w ścieżce klas. Przeczytamy „fileTest.txt” dostępny w src / main / resources :
W powyższym fragmencie kodu użyliśmy bieżącej klasy do załadowania pliku za pomocą metody getResourceAsStream i przekazaliśmy bezwzględną ścieżkę do pliku do załadowania.
Ta sama metoda jest dostępna w także instancja ClassLoader:
Otrzymujemy classLoa der bieżącej klasy przy użyciu metody getClass (). getClassLoader ().
Główna różnica polega na tym, że podczas korzystania z getResourceAsStream w instancji ClassLoader ścieżka jest traktowana jako bezwzględna, zaczynając od katalogu głównego ścieżki klas.
W przypadku użycia przeciwko instancji Class, ścieżka może być względna w stosunku do pakietu lub ścieżką bezwzględną, do której wskazuje początkowy ukośnik.
Oczywiście, w praktyce , otwarte strumienie powinny być zawsze zamknięte, tak jak w naszym przykładzie InputStream:
3.2. Korzystanie z biblioteki commons-io
Inną popularną opcją jest użycie klasy FileUtils z pakietu commons-io:
Tutaj przekazujemy obiekt File do metoda readFileToString () klasy FileUtils. Ta klasa narzędziowa zarządza ładowaniem treści bez konieczności pisania jakiegokolwiek standardowego kodu w celu utworzenia instancji InputStream i odczytu danych.
Ta sama biblioteka oferuje również klasę IOUtils:
Tutaj przekazać obiekt FileInputStream do metody toString () klasy IOUtils. Ta klasa narzędziowa działa w taki sam sposób, jak poprzednia, tworząc instancję InputStream i odczytując dane.
Czytanie z BufferedReader
Teraz pozwólmy ” Skoncentruj się na różnych sposobach analizowania zawartości pliku.
Zaczniemy od prostego sposobu odczytu z pliku za pomocą BufferedReader:
Zwróć uwagę, że readLine () zwróci null po osiągnięciu końca pliku.
Czytanie z pliku przy użyciu Java NIO
W JDK7 pakiet NIO został znacznie zaktualizowany.
Spójrzmy na przykład wykorzystujący klasę Files i metodę readAllLines. Metoda readAllLines akceptuje Path.
Klasa Path może być traktowana jako aktualizacja java.io.File z kilkoma dodatkowymi operacjami.
5.1. Czytanie małego pliku
Poniższy kod pokazuje, jak czytać mały plik przy użyciu nowej klasy Files:
Zauważ, że możemy użyć metody readAllBytes () również, jeśli potrzebujemy danych binarnych.
5.2. Czytanie dużego pliku
Jeśli chcemy odczytać duży plik z klasą Files, możemy użyć klasy BufferedReader.
Poniższy kod odczytuje plik za pomocą nowa klasa Files i BufferedReader:
5.3. Czytanie pliku za pomocą Files.lines ()
JDK8 oferuje metodę lines () wewnątrz klasy Files. Zwraca strumień elementów typu String.
Spójrzmy na przykład wczytywania danych do bajtów i dekodowania ich przy użyciu zestawu znaków UTF-8.
Poniższy kod odczytuje plik przy użyciu the new Files.lines ():
Używając Stream z kanałami IO, takimi jak operacje na plikach, musimy jawnie zamknąć strumień za pomocą metody close ().
Jak widać, API Files oferuje inny łatwy sposób na odczytanie zawartości pliku do postaci ciągu.
W następnych sekcjach przyjrzymy się innym, mniej popularnym metodom czytanie pliku, który może być odpowiedni w niektórych sytuacjach.
Czytanie ze skanerem
Następnie użyjmy skanera do odczytu z pliku. Tutaj użyjemy białych znaków jako separatora:
Zauważ, że domyślnym separatorem jest biały znak, ale w skanerze można używać wielu separatorów.
Klasa Scanner jest przydatna podczas czytania zawartość z konsoli lub gdy zawartość zawiera wartości pierwotne, ze znanym ogranicznikiem (np. lista liczb całkowitych oddzielonych spacją).
Czytanie za pomocą StreamTokenizera
Teraz wczytajmy plik tekstowy na tokeny za pomocą StreamTokenizera.
Tokenizer działa najpierw poprzez ustalenie, jaki jest następny token, łańcuch lub liczba. Robimy to patrząc na pole tokenizer.ttype.
Następnie odczytujemy rzeczywisty token oparty na tym typie:
- tokenizer.nval – jeśli typ był a number
- tokenizer.sval – jeśli typ był typu String
W tym przykładzie użyjemy innego pliku wejściowego, który po prostu zawiera:
Poniższy kod odczytuje z pliku zarówno ciąg znaków, jak i numer:
Zwróć uwagę, jak koniec tokenu pliku jest używany na końcu.
To podejście jest przydatne do przetwarzania strumienia wejściowego na tokeny.
Czytanie z DataInputStream
Możemy użyć DataInputStream do odczytu binarnego lub prymitywne typy danych z pliku.
Poniższy test odczytuje plik przy użyciu DataInputStream:
Czytanie z FileChannel
Jeśli czytają duży plik, FileChannel może być szybszy niż standardowe IO.
Poniższy kod odczytuje bajty danych z pliku przy użyciu funkcji FileChannel i RandomAccessFile:
Odczytywanie kodowania UTF-8 ed File
Zobaczmy teraz, jak odczytać plik zakodowany w UTF-8 przy użyciu BufferedReader. W tym przykładzie „odczytujemy plik zawierający chińskie znaki:
Odczytywanie treści z adresu URL
Aby odczytać treść z adresu URL, użyjemy Adres URL „/” w naszym przykładzie:
Istnieją również alternatywne sposoby łączenia się z adresem URL. Tutaj użyliśmy adresu URL i klasy URLConnection dostępnych w standardowym SDK.
Odczytywanie pliku z JAR
Aby odczytać plik, który znajduje się wewnątrz JAR, będziemy potrzebować JAR z plikiem w środku. W naszym przykładzie przeczytamy „LICENSE.txt” z pliku „hamcrest-library-1.3.jar”:
Tutaj chcemy załadować LICENSE.txt, który znajduje się w bibliotece Hamcrest, więc użyjemy klasę Matchera, która pomaga uzyskać zasób. Ten sam plik można również załadować za pomocą modułu ładującego.
Wniosek
Jak widzimy, istnieje wiele możliwości załadowania pliku i odczytania z niego danych przy użyciu zwykłej Javy.
Możemy załadować plik z różnych lokalizacji, takich jak ścieżka klas, URL lub pliki jar.
Następnie możemy może używać BufferedReader do czytania wiersz po wierszu, Scanner do odczytu przy użyciu różnych separatorów, StreamTokenizer do wczytywania pliku na tokeny, DataInputStream do odczytu danych binarnych i pierwotnych typów danych, SequenceInput Stream do łączenia wielu plików w jeden strumień, FileChannel do szybszego odczytu z dużych pliki itp.