W sekcji „Film samouczek” użyte zostały obiekty klasklasaklas ScannerFileWriter. Teraz dokładniej omówimy wykorzystane tam metody odczytywania i zapisywania danych do pliku oraz pokażemy inne sposoby pozwalające na osiągnięcie takiego samego efektu. Przedstawione tu metody pozwolą na zapoznanie się zarówno z obsługą plików tekstowychplik tekstowyplików tekstowych, jak i obsługą danych zapisywanych i odczytywanych bajtami.

Zapisywanie informacji w nowym pliku

Do zapisu danych w pliku możemy wykorzystać przedstawioną w poprzedniej sekcji klasęklasaklasę FileWriter. Jest to klasa służąca do zapisywania danych tekstowych w domyślnym kodowaniu znaków systemu operacyjnego (np. UTF‑8 dla systemu Windows).

Użycie klasy wymaga utworzenia obiektu z wykorzystaniem konstruktora, który jako pierwszy argument przyjmuje ścieżkę do pliku. Jeżeli jako drugi opcjonalny argument podamy wartość true, dane będzie można dopisywać na końcu pliku. Jeżeli nie podajemy drugiego argumentu lub kiedy podamy wartość false, dane zapisywane w pliku zastępują dotychczasową zawartość.

Linia 1. FileWriter wyjscie znak równości new FileWriter otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły średnik.
Linia 1. FileWriter wyjscie znak równości new FileWriter otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów przecinek true zamknij nawias okrągły średnik.

Przykłady ścieżki do pliku:

  • w systemie Windows: C:\\Dane\\plik.txt,

  • w systemie Linux: /home/uzytkownik/dane/plik.txt.

Ważne!

Odwołując się do danej lokalizacji w języku Java, używamy podwójnych ukośników dla języka Windows. Wynika to z tego, że pojedynczy ukośnik jest traktowany jako znak specjalny.

Jeżeli program i odczytywany plik znajdują się w tym samym katalogu, ścieżkę ograniczamy tylko do nazwy pliku.

Omawiany obiekt typu FileWriter można również utworzyć, przekazując do konstruktora obiekt klasy File:

Linia 1. File plik znak równości new File otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły średnik. Linia 2. FileWriter wyjscie znak równości new FileWriter otwórz nawias okrągły plik zamknij nawias okrągły średnik.
Linia 1. File plik znak równości new File otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły średnik. Linia 2. FileWriter wyjscie znak równości new FileWriter otwórz nawias okrągły plik przecinek true zamknij nawias okrągły średnik.

Do zapisu danych przy użyciu obiektu typu FileWriter służy metoda write(). Jako argumenty przyjmuje wartość tekstową.

Linia 1. FileWriter wyjscie znak równości new FileWriter otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły średnik. Linia 2. String treść znak równości cudzysłów Tekst do wyświetlenia cudzysłów średnik. Linia 3. wyjscie kropka write otwórz nawias okrągły treść zamknij nawias okrągły średnik.

Po zakończeniu korzystania z obiektu, należy zamknąć strumień wyjścia przy użyciu metody close().

Linia 1. wyjscie kropka close otwórz nawias okrągły zamknij nawias okrągły średnik.

Do zapisywania danych tekstowych do pliku służy również klasa BufferedWriter. Różni się ona od klasy FileWriter możliwością buforowania znaków w celu wydajniejszego zapisywania znaków, ich ciągów i tablic.

Podobnie jak w przypadku klasy FileWriter, by wykorzystać klasę BufferedWriter do zapisu danych do pliku, musimy utworzyć obiekt tej klasy. Konstruktor klasy jako argument przyjmuje obiekt klasy FileWriter, któremu podajemy ścieżkę do pliku.

Linia 1. BufferedWriter wyjscie znak równości new BufferedWriter otwórz nawias okrągły. Linia 2. new FileWriter otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły zamknij nawias okrągły średnik.

Aby zapisać dane do pliku z wykorzystaniem obiektu klasy BufferedWriter, wykorzystujemy metodę write(), która zapisuje do pliku podany jej jako argument znak lub ciąg znaków (jeżeli chcemy zapisać dane innego typu, najpierw należy je przekonwertować do typu tekstowego).

Linia 1. BufferedWriter wyjscie znak równości new BufferedWriter otwórz nawias okrągły. Linia 2. new FileWriter otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 4. String tekstDoZapisu znak równości cudzysłów test cudzysłów średnik. Linia 5. wyjscie kropka write otwórz nawias okrągły tekstDoZapisu zamknij nawias okrągły średnik. Linia 6. wyjscie kropka write otwórz nawias okrągły cudzysłów daneDoZapisu cudzysłów zamknij nawias okrągły średnik.

Podobnie jak w poprzednim wypadku, otwarty strumień wyjścia należy zamknąć po zakończeniu korzystania z niego za pomocą wywołania metody close() na obiekcie klasy BufferedWriter.

Linia 1. BufferedWriter wyjscie znak równości new BufferedWriter otwórz nawias okrągły. Linia 2. new FileWriter otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 3. wyjscie kropka close otwórz nawias okrągły zamknij nawias okrągły średnik.

Ostatnią klasą służącą do zapisywania danych do pliku, którą omówimy, będzie klasa FileOutputStream. Podobnie jak w wypadku innych klas, na początku musimy utworzyć jej obiekt. Konstruktor jako argument przyjmuje obiekt klasy File reprezentujący plik, do którego chcemy zapisywać dane.

Linia 1. FileOutputStream wyjscie znak równości new FileOutputStream otwórz nawias okrągły. Linia 2. new File otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły zamknij nawias okrągły średnik.

Tak jak we wcześniej omówionych klasach, tutaj również metodą służącą do zapisu danych do pliku jest metoda write(). Klasa ta różni się jednak od poprzednich tym, że operuje na bajtach, nie na danych tekstowych. Musimy zatem pamiętać, by dane do zapisania przekonwertować na bajty (często jest do tego wykorzystywana metoda getBytes()).

Linia 1. FileOutputStream wyjscie znak równości new FileOutputStream otwórz nawias okrągły. Linia 2. new File otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 4. String dane znak równości cudzysłów daneDoZapisania cudzysłów średnik. Linia 5. wyjscie kropka write otwórz nawias okrągły dane kropka getBytes otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły średnik.

Po zakończeniu pracy na strumieniu wyjścia należy go zamknąć za pomocą metody close().

Linia 1. FileOutputStream wyjscie znak równości new FileOutputStream otwórz nawias okrągły. Linia 2. new File otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 4. wyjscie kropka close otwórz nawias okrągły zamknij nawias okrągły średnik.

Dopisywanie informacji do pliku

Czasami nie chcemy tworzyć nowego pliku, a dodać informacje do już istniejącego. W takiej sytuacji postępujemy podobnie jak w dotychczas przestawionych przykładach – zmieniamy tylko sposób wywołania konstruktora klasy FileWriter. Przyjmuje on dodatkowy argument w postaci wartości logicznej true, która sygnalizuje, że do otwartego w ten sposób pliku będziemy dopisywać nową treść przy zachowaniu jego oryginalnej zawartości. Nowe dane dopisywane są na końcu pliku.

Poniżej przykłady użycia omawianych wcześniej klas:

Linia 1. FileWriter wyjscie znak równości new FileWriter otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów przecinek true zamknij nawias okrągły średnik. Linia 3. BufferedWriter wyjscie znak równości new BufferedWriter otwórz nawias okrągły. Linia 4. new FileWriter otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów przecinek true zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 6. FileOutputStream wyjscie znak równości new FileOutputStream otwórz nawias okrągły new File otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły przecinek true zamknij nawias okrągły średnik.

Do dopisywania danych używamy stosowanej już wcześniej metody write(), natomiast aby zamknąć wykorzystany strumień, przywołujemy metodę close().

Linia 1. FileWriter wyjscie znak równości new FileWriter otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów przecinek true zamknij nawias okrągły średnik. Linia 2. String tekst znak równości cudzysłów tekstDoZapisania cudzysłów średnik. Linia 3. wyjscie kropka write otwórz nawias okrągły tekst zamknij nawias okrągły średnik. Linia 4. wyjscie kropka close otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 1. BufferedWriter wyjscie znak równości new BufferedWriter otwórz nawias okrągły new FileWriter otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów przecinek true zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 2. String tekst znak równości cudzysłów tekstDoZapisania cudzysłów średnik. Linia 3. wyjscie kropka write otwórz nawias okrągły tekst zamknij nawias okrągły średnik. Linia 4. wyjscie kropka close otwórz nawias okrągły zamknij nawias okrągły średnik.
Linia 1. FileOutputStream wyjscie znak równości new FileOutputStream otwórz nawias okrągły new File otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły przecinek true zamknij nawias okrągły średnik. Linia 2. String tekst znak równości cudzysłów tekstDoZapisania cudzysłów średnik. Linia 3. wyjscie kropka write otwórz nawias okrągły tekst kropka getBytes otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 4. wyjscie kropka close otwórz nawias okrągły zamknij nawias okrągły średnik.

Odczytywanie danych z pliku

Gdy piszemy program analizujący duże ilości danych, nie wprowadzamy ich zazwyczaj za pomocą klawiatury. Tak czasochłonny proces warto przyspieszyć, wczytując informacje z pliku tekstowegoplik tekstowypliku tekstowego.

W języku Java mamy do dyspozycji wiele metod umożliwiających odczytanie danych z pliku. Omówimy tutaj cztery z nich.

Pierwszy sposób wymaga użycia klasy FileReader. Podobnie jak w przypadku operacji zapisu, najpierw musimy utworzyć obiekt klasy FileReader. Jako argument konstruktora podajemy ścieżkę do pliku, który chcemy odczytać.

Linia 1. FileReader wejscie znak równości new FileReader otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły.

Do odczytywania pojedynczych znaków służy metoda read(), która zwraca wartość typu całkowitego. Wartość tę trzeba przekonwertować na typ tekstowy, aby otrzymać odczytany znak. Metoda zwraca wartość , jeżeli odczytano wszystkie dane. Dzięki czemu użyta w pętli pozwala odczytać wszystkie znaki z pliku. Choć jest to możliwe, omawiana metoda nie jest zalecana do odczytywania liczb z plików tekstowych.

Po wykorzystaniu obiektu FileReader strumień wejścia zamykamy za pomocą metody close().

Linia 1. FileReader wejscie znak równości new FileReader otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły średnik. Linia 2. int znakZPliku znak równości wejscie kropka read otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 3. while otwórz nawias okrągły znakZPliku wykrzyknik znak równości minus 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 4. System kropka out kropka println otwórz nawias okrągły otwórz nawias okrągły char zamknij nawias okrągły znakZPliku zamknij nawias okrągły średnik. Linia 5. znakZPliku znak równości wejscie kropka read otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 6. zamknij nawias klamrowy. Linia 7. wejscie kropka close otwórz nawias okrągły zamknij nawias okrągły średnik.

Innym sposobem odczytywania z pliku jest wykorzystanie klasy BufferedReader. Przy tworzeniu obiektu tej klasy jako argument do jej konstruktora podajemy obiekt typu FileReader.

Linia 1. BufferedReader wejscie znak równości new BufferedReader otwórz nawias okrągły new FileReader otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły zamknij nawias okrągły średnik.

Klasa ta pozwala na odczytanie całego wiersza danych tekstowych z podanego pliku za pomocą metody readLine() (zwróci wartość null w przypadku braku wartości do odczytu). Po odczytaniu danych strumień wejścia zamykamy.

Linia 1. BufferedReader wejscie znak równości new BufferedReader otwórz nawias okrągły new FileReader otwórz nawias okrągły cudzysłów liczby kropka txt cudzysłów zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 2. String wiersz znak równości cudzysłów cudzysłów średnik. Linia 3. while otwórz nawias okrągły otwórz nawias okrągły wiersz znak równości wejscie kropka readLine otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły wykrzyknik znak równości null zamknij nawias okrągły otwórz nawias klamrowy. Linia 4. System kropka out kropka println otwórz nawias okrągły wiersz zamknij nawias okrągły średnik. Linia 5. zamknij nawias klamrowy. Linia 6. wejscie kropka close otwórz nawias okrągły zamknij nawias okrągły średnik.

Kolejny sposób odczytywania danych z plików, który został wykorzystany w sekcji multimedialnej, polega na użyciu klasy Scanner. Podczas tworzenia obiektu tej klasy wymagane jest podanie konstruktorowi obiektu typu File wskazującego plik, z którego chcemy skorzystać.

Linia 1. Scanner wejscie znak równości new Scanner otwórz nawias okrągły new File otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły zamknij nawias okrągły średnik.

Klasa Scanner posiada kilka metod, które zazwyczaj wykorzystuje się w pętli:

  • next() – odczytuje z pliku nieprzerwany ciąg znaków aż do napotkania znaku spacji, tabulacji lub końca linii,

  • nextInt() – pozwala na odczytanie ciągu znaków jako liczby całkowitej aż do napotkania znaku spacji, tabulacji lub końca linii,

  • nextLine() – umożliwia odczytanie całego wiersza pliku.

Do odczytywania kolejnych nieprzerwanych ciągów znaków z pliku, np. wyrazów, użyjemy kodu:

Linia 1. Scanner wejscie znak równości new Scanner otwórz nawias okrągły new File otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 2. while otwórz nawias okrągły wejscie kropka hasNext otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. String wyraz znak równości wejscie kropka next otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 4. System kropka out kropka println otwórz nawias okrągły wyraz zamknij nawias okrągły średnik. Linia 5. zamknij nawias klamrowy.

Aby odczytać kolejne liczby całkowite z pliku, zastosujemy zapis:

Linia 1. Scanner wejscie znak równości new Scanner otwórz nawias okrągły new File otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 2. while otwórz nawias okrągły wejscie kropka hasNextInt otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. int liczba znak równości wejscie kropka nextInt otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 4. System kropka out kropka println otwórz nawias okrągły liczba zamknij nawias okrągły średnik. Linia 5. zamknij nawias klamrowy.

Natomiast fragment kodu odpowiedzialny za odczytanie kolejnych wierszy prezentuje się następująco:

Linia 1. Scanner wejscie znak równości new Scanner otwórz nawias okrągły new File otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 2. while otwórz nawias okrągły wejscie kropka hasNextLine otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. String wiersz znak równości wejscie kropka nextLine otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 4. System kropka out kropka println otwórz nawias okrągły wiersz zamknij nawias okrągły średnik. Linia 5. zamknij nawias klamrowy.

Po odczytaniu danych strumień wejścia zamykamy:

Linia 1. Scanner wejscie znak równości new Scanner otwórz nawias okrągły new File otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 2. wejscie kropka close otwórz nawias okrągły zamknij nawias okrągły.

Ostatnią klasą umożliwiającą odczytanie danych z pliku, którą tu omówimy, jest klasa FileInputStream pozwalająca na odczytanie danych bajtowych. Jej konstruktor przyjmuje jako parametr obiekt klasy File. Może ona być użyta m.in. do odczytania danych zapisanych do pliku za pomocą klasy FileOutputStream.

Linia 1. FileInputStream wejscie znak równości new FileInputStream otwórz nawias okrągły new File otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły zamknij nawias okrągły średnik.

Klasa ta przeznaczona jest do odczytu nieprzetworzonych bajtów, takich jak np. dane obrazu. Nie jest zalecana do odczytywania plików tekstowych. Do czytania pojedynczych bajtów stosuje się metodę read(), która zwraca wartość całkowitą z zakresu 0; 255 lub wartość , kiedy osiągnie koniec pliku.

Po zakończeniu odczytywania danych strumień wejściowy należy zamknąć.

Linia 1. FileInputStream wejscie znak równości new FileInputStream otwórz nawias okrągły new File otwórz nawias okrągły cudzysłów sciezkaDoPliku cudzysłów zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 2. int bajt średnik. Linia 3. while otwórz nawias okrągły otwórz nawias okrągły bajt znak równości wejscie kropka read otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły wykrzyknik znak równości minus 1 zamknij nawias okrągły. Linia 4. System kropka out kropka print otwórz nawias okrągły bajt zamknij nawias okrągły średnik. Linia 5. wejscie kropka close otwórz nawias okrągły zamknij nawias okrągły średnik.

Program wypisze zawartość podanego pliku w postaci liczb całkowitych z zakresu 0; 255, ponieważ taki zakres wartości można zapisać w jednym bajcie.

Wypisywane liczby można zamieniać na znaki: System.out.print((char)bajt); – traktując je jako kody ASCII. Jeżeli odczytywany plik zawiera tekst zapisany tylko za pomocą znaków alfanumerycznych z tabeli ASCII, na wyjściu zobaczymy jego zawartość. W pozostałych przypadkach również zobaczymy ciąg znaków z tabeli ASCII, ale niebędący komunikatywnym tekstem.

Ważne!

Przed użyciem omówionych klas pamiętajmy o ich zaimportowaniu. Klasę Scanner importujemy z pakietu java.util, wszystkie pozostałe z pakietu java.io.

Słownik

klasa
klasa

szablon, na podstawie którego tworzymy obiekty; zawiera definicję właściwości (zmiennych) i działań (funkcji zwanych metodami) obiektu

plik tekstowy
plik tekstowy

plik, który przechowuje ciąg znaków zapisany według wybranego kodowania