Inne działy

Java przykładowe programy

 

Jak odczytać plik tekstowy w Java

 

Manipulowanie plikami tekstowymi jest to podstawowa umiejętność, która będzie dobrze ci służyć w twojej karierze programowania. W tym rozdziale dowiesz się, jak otworzyć i jak napisać do pliku tekstowego. Ale plik tekstowy, po prostu oznacza, plik z tekstem w nim - proste! Możesz utworzyć plik tekstowy w programach takich jak Notatnik w systemie Windows, TextEdit na Mac, Gedita w środowisku Linux / Gnome.

Pierwszą rzeczą, którą możemy zrobić, to otworzyć plik tekstowy i odczytać jego zawartość.

 

Przeczytaj plik tekstowy

Rozpocznij nowy projekt. Nazwij pakiet (package) plikitekstowe oraz klasa PlikiTekstowe.Dodaj instrukcję importu tuż poniżej linii pakietu, a przed nazwą klasy:

import java.io.IOException;

Okno kodowania będzie wyglądać tak:

 

package plikitekstowe;

import java.io.IOException;

public class PlikiTekstowe {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
    }
    
}

Aby poradzić sobie z błędami związanymi z naszą obsługą plików, dodaj następujący kod do głównej procedury:

public static void main(String[ ] args) throws IOException {
}

Informujemy Jave, że głównq metoda będzie wyrzucać błąd IOException, i że musi go obsłużyć. Później dodamy bloktry ... catch, aby wyświetlić odpowiedni komunikat dla użytkownika, gdyby coś poszło nie tak.

Aby otworzyć plik tekstowy, stwórzmy nową klasę. Więc kliknij File > New File z menu NetBeans na górze. Utwórz nowy plik klasy Java i nadaj mu nazwę CzytajPlik . Kiedy twoja nowa klasa jest tworzona, należy dodać następujące trzy instrukcje importu:

import java.io.IOException;
import java.io.FileReader;
import java.io.BufferedReader;

Twoja nowa klasa powinna wtedy wyglądać jak poniżej:

 

package plikitekstowe;

import java.io.IOException;
import java.io.FileReader;
import java.io.BufferedReader;

public class CzytajPlik {
    
}

(Linie importowe są podkreślone, ponieważ nie są jeszcze nigdzie wykorzystane. To jest cecha NetBeans.)

Stworzymy nowy obiekt dla tej klasy do odczytu pliku. Dodaj następujący kod do konstruktora, wraz z polem typu  private String o nazwie sciezka :

 

public class CzytajPlik {
    
    private String sciezka;
    
    public CzytajPlik(String plik_sciezka){
        sciezka = plik_sciezka;
    }
    
}

Wszystko, co robimy tutaj to pobranie nazwy pliku, a następnie przypisujemy nazwę pliku w polu sciezka.

Co musimy teraz zrobić, to stworzyć metodę, która zwraca wszystkie wiersze tekstu z pliku tekstowego.Linie będą przechowywane w tablicy. Dodaj następującą deklarację metody, która otworzy plik:

 

public class CzytajPlik {
    
    private String sciezka;
    
    public CzytajPlik(String plik_sciezka){
        sciezka = plik_sciezka;
    }
    
    public String[] OtworzPlik() throws IOException {
        
    }
}

Nie martw się czerwonym podkreśleniem: zniknie on po dodaniu kodu. NetBeans dodaje podkreślenie, ponieważ nie mamy instrukcji return.

Zauważ, że metoda jest skonfigurowana, aby zwrócić tablicę ciągów:

public String[ ]

Tablica będzie zawierać wszystkie wiersze z pliku tekstowego.

Zwróć uwagę także, że dodaliśmy "throws IOException" na końcu nagłówka metody. Każda metoda, która zajmuje się czytaniem plików tekstowych wymaga jednego z nich. Gdy Java wyrzuci jakieś błędy, zostaną one wychwycone w głównej metodzie.

Aby odczytać znaki z pliku tekstowego, służy do tego klasa FileReader. Odczytuje bajty z pliku tekstowego, a każdy bajt to jeden znak. Możesz przeczytać całe wiersze tekstu, a nie pojedyncze znaki. Aby to zrobić, możesz oddać swoją klasę FileReader do czegoś, co nazywa się BufferedReader . BufferedReader ma poręczną metodę zwaną ReadLine. Jak sama nazwa wskazuje, służy do czytania całych linii, zamiast pojedynczych znaków. Klasa BufferedReader, służy do przechowywania w pamięci znaków (bufor), tak że mogą one być łatwo manipulowane.

Dodaj następujące linie, które tworzą obiekty FileReader i BufferedReader:

 

public String[] OtworzPlik() throws IOException {
        
        FileReader fr = new FileReader(sciezka);
        BufferedReader czytajTekst = new BufferedReader(fr);
        
    }

Tworzymy tu dwa nowe obiekty: jeden jest obiektem FileReader który nazwaliśmy fr ; Drugi to obiekt to BufferedReader o nazwie CzytajTekst.

Obiekt FileReader potrzebuje nazwę pliku do otwarcia. Dla nas, ścieżka i nazwa pliku jest przechowywana w zmiennej o nazwie sciezka. Więc możemy to wykorzystać.

Do BufferedReader jest przekazywany obiekt FileReader umieszczony w nawiasach okrągłych. Wszystkie znaki z pliku są następnie przechowywane w pamięci i czekają na manipulację. Odbywają się one w zmiennej CzytajTekst.

Zanim będziemy mogli przeczytać wiersze tekstu, musimy ustawić tablicę. Każda pozycja w tablicy może następnie przechowywać jeden pełny wiersz tekstu. Więc należy dodać następujące dwie linie kodu:

int liczbaWierszy = 3;
String[ ] tekstDane = new String[liczbaWierszy];

Na razie ograniczymy liczbę wierszy w pliku tekstowym do zaledwie 3. Oczywiście, pliki tekstowe mogą posiadać dowolną liczbę linii, a my zwykle nie wiemy, jak wiele ich jest. Będziemy wkrótce to zmieniać. Napiszemy oddzielną metodę, która pobiera liczbę wierszy w pliku tekstowym.

Druga linia nowego kodu, jednak ustawia tablicę ciągów. Liczba pozycji w tablicy (jej rozmiar) jest ustawiony na liczbę wierszy. Umiesciliśmy to między nawiasami kwadratowymi.

Aby przyporządkować wszystkie wiersze tekstu z pliku do każdej pozycji w tablicy, musimy użyć pętli. Pętla będzie odczytywać każdy wiersz tekstu i umieści każdy wiersz w tablicy. Dodaj następujący kod:

 

int i;       

        for(i=0; i < liczbaWierszy; i++){

            tekstDane[i] = czytajTekst.readLine();

        }

Okno kodowania powinno teraz wyglądać tak:

 

public String[] OtworzPlik() throws IOException {
        
        FileReader fr = new FileReader(sciezka);
        BufferedReader czytajTekst = new BufferedReader(fr);
        
        int liczbaWierszy = 3;
        String[] tekstDane = new String[liczbaWierszy];
        
        int i;
        
        for(i=0; i < liczbaWierszy; i++){
            tekstDane[i] = czytajTekst.readLine();
        }
    }

Pętla przechodzi od 0 do liczby wierszy pomniejszonej o jeden. (Pozycje tablicy, pamiętaj, rozpoczynają się od 0. 3 linie będą przechowywane w pozycji 0, 1 i 2).

Linia, która umożliwia dostęp do linii tekstu i zapisuje je w tablicy jest następująca:

tekstDane[i] = czytajTekst.readLine( );

Po znaku równości mamy następujący kod:

czytajTekst.readLine( );

Obiekt TextReader przechowuje wszystkie znaki z pliku tekstowego w pamięci (bufor). Możemy użyć metody readLine do odczytu kompletnej linii z bufora. Po odczytaniu linii, przechowujemy linię w pozycji tablicy:

textData[i]

Zmienna o nazwie i będzie zwiększana za każdym przejściem pętli, więc przechodzi przez całą tablicę i umieszcza tekst do przechowywania.

Należy dodać dwie kolejne linie kodu, do metody.

textReader.close( );
return textData;

Metoda close opróżnia bufor pamięci tymczasowej o nazwie czytajTekst. Instrukcja return zwraca całą tablicę. Zauważ, że nie są potrzebne nawiasy kwadratowe dla nazwy tablicy.

Po dodaniu kodu, wszystkie te brzydkie podkreślenia powinny zniknąć. Twoja metoda powinna wyglądać następująco:

 

public String[] OtworzPlik() throws IOException {
        
        FileReader fr = new FileReader(sciezka);
        BufferedReader czytajTekst = new BufferedReader(fr);
        
        int liczbaWierszy = 3;
        String[] tekstDane = new String[liczbaWierszy];
        
        int i;
        
        for(i=0; i < liczbaWierszy; i++){
            tekstDane[i] = czytajTekst.readLine();
        }
        
        czytajTekst.close();
        return tekstDane;
    }

Jest jeszcze problem z ilością linii. Mamy ograniczenie do 3. Ale potrzeba nam przejść przez dowolny plik tekstowy i policzyć ile ma linii. Dodaj następującą metodę do klasy CzytajPlik:

 

int CzytajLinie() throws IOException {
        
        FileReader plik_do_czytania = new FileReader(sciezka);
        BufferedReader bf = new BufferedReader(plik_do_czytania);
        
        String linie;
        int liczbaLinii = 0;
        while((linie = bf.readLine()) != null){
            liczbaLinii++;
        }
        bf.close();
        
        return liczbaLinii;
    }

Nowa metoda jest nazywana czytajLinie i zwraca wartość całkowitą. Jest to liczba linii w pliku tekstowym. Zauważmy, że metoda ta ma również częśćIOException  dodaną do nagłówka metody.

Kod dla metody ustanawia kolejny obiekt FileReader i BufferedReader. Do odczytania liczby wierszy tekstu używamy następującej pętli:

 

while ( ( linie= bf.readLine( ) ) != null ) {
      liczbaLinii++;
}

Pętla while wygląda nieco niechlujnie. Ale to po prostu mówi "czytaj każdy wiersz tekstu i zatrzyma się, gdy zostanie osiągnięta wartość null." (Jeśli nie ma więcej wierszy w pliku tekstowym, Java zwraca wartość null.) Wewnątrz nawiasów klamrowych, zwiększamy licznik o nazwie liczbaLinii.

Ostatnie dwa wiersze kodu opróżniają bufor pamięci o nazwie bf, i zwracają liczbę wierszy.

Wywołajmy tę nową metodę do działania, zmień linię kodu w metodzie OtworzPlik:

int liczbaWierszy = 3;

Zmień na:

int liczbaWierszy = CzytajLinie( );

Więc zamiast kodować na stałe liczbę linii, możemy nazwać naszą nową metodę i uzyskać liczbę wierszy w każdym pliku tekstowym.

OK, czas na zaprzęgnięcie klasy do pracy i zobaczyć, czy otwiera plik tekstowy.

Wróć do klasyPlikiTekstowe, do głównej metody main. Ustaw zmienną string zaweirającą nazwę pliku tekstowego:

 

package plikitekstowe;

import java.io.IOException;


public class PlikiTekstowe {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        
        String nazwa_pliku = "c:/test.txt";
    }
    
}

Na tym etapie, należy utworzyć plik tekstowy i zapisać go na dysku c. Stworzyliśmy ten prosty plik w Notatniku na komputerze z systemem Windows, który zawiera cztery przykładowe linie z tekstem:

Nazwa pliku tekstowego to "test.txt". Utwórz podobny plik tekstowy na własnym komputerze. Należy pamiętać, gdzie został zapisany, ponieważ trzeba podać ścieżkę do pliku:

String nazwa_pliku = "C:/test.txt";

Nasz plik test.txt jest zapisany na dysku C. Gdybyśmy utworzyli folder o nazwie mojePliki do przechowania pliku, należy także zmienić ścieżką będzie "C :/mojePliki/ test.txt". Zmień ścieżkę dostępu, w razie potrzeby.

Następną rzeczą do wykonania jest utworzenie nowego obiektu z  klasy ReadFile. Możemy wywołać metodę, która otwiera plik. Ale możemy to zrobić w bloku try ... catch. Dodaj następujący kod, tuż poniżej linii ze zmienną String:


public static void main(String[] args) throws IOException {
        
        String nazwa_pliku = "c:/test.txt";
        
        try {
            CzytajPlik plik = new CzytajPlik(nazwa_pliku);
            String[] wierszTablicy = plik.OtworzPlik();
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
        
    } 

 

Nie zapomnij o wszystkich nawiasach klamrowych dla bloku try ... catch. Jedną parę mamy dla części try a drugą parę dla części catch. Dla części try, mamy poniższy kod:

CzytajPlik plik = new CzytajPlik(nazwa_pliku);

String[] wierszTablicy = plik.OtworzPlik();

Pierwsza linia tworzy nowy obiekt CzytajPlik nazwie plik . W nawiasach okrągłych obiektu CzytajPlik, dodaliśmy zmiennąnazwa_pliku . To wystarczy, aby przekazać konstruktorowi ścieżkę pliku jaką potrzebuje.

Drugi wiersz kodu ustawia tablicę String o nazwie wierszTablicy . Po znaku równości, wywołujemy metodę OtworzPlik() z naszej klasy CzytajPlik. Jeśli plik tekstowy z powodzeniem zostanie otwarty, to wiersze tekstu zostaną przekazane do tablicy wierszTablicy.

Jeśli coś pójdzie nie tak, i jednak wystąpi błąd, wykonywanie kodu zostanie przekazane do instrukcji catchbloku try ... catch:

 

catch ( IOException e ) {
System.out.println( e.getMessage() );
}

Po słowie "catch" mamy parę okrągłych nawiasów. Wewnątrz nawiasów okrągłych, mamy instrukcję:

IOException e

Instrukcja ta tworzy zmienną o nazwie e, która jest typu IOException . Obiekt IOException ma swoje własne metody, których można użyć. Jednym z takich sposobów jest getMessage. Daje użytkownikowi pewne informacje na temat tego, co poszło nie tak.

Zanim zobaczymy przykład komunikatu o błędzie, przejdźmy pętlą przez wszystkie linie w pliku tekstowym, drukując każdą z nich. Dodaj następujący kod do pętli w części try w bloku try ... catch:

 

int i;

for(i=0; i < wierszTablicy.length;i++){

    System.out.println(wierszTablicy[i]);
}

Okno kodowania powinno teraz wyglądać tak:


public static void main(String[] args) throws IOException {
        
        String nazwa_pliku = "c:/test.txt";
        
        try {
            CzytajPlik plik = new CzytajPlik(nazwa_pliku);
            String[] wierszTablicy = plik.OtworzPlik();
            
            int i;
            for(i=0; i < wierszTablicy.length;i++){
                System.out.println(wierszTablicy[i]);
            }
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
        
    }   

 

Gdy program jest uruchomiony, okno wyjścia będzie wyświetlać, co następuje:

run:
To jest linia pierwsza
To jest linia druga
To jest linia trzecia
To jest linia czwarta
BUILD SUCCESSFUL (total time: 0 seconds)

Jak widać, każda linia z naszego pliku tekstowego została wyświetlona.

Aby przetestować sprawdzenie części kodu odpowiedzialnego za obsługę błędów, zmień nazwę pliku tekstowego. Następnie uruchom swój kod ponownie. W oknie Output poniżej można zobaczyć, że nasz plik tekstowy został zmieniony na test1 , i że nie można go znaleźć:

 

run:
c:\test.txt (Nie można odnaleźć określonego pliku)
BUILD SUCCESSFUL (total time: 0 seconds)

Jeśli wolisz, możesz dodać własny komunikat o błędzie do bloku catch:

 

catch (IOException e) {
            System.out.println("Nie odnaleziono pliku");
        }

 

run:
Nie odnaleziono pliku
BUILD SUCCESSFUL (total time: 0 seconds)

W kolejnej części dowiesz się, jak napisać do pliku tekstowego za pomocą kodu Java.

 

Zobacz nasze wszystkie kursy

WWW


HTML
HTML - Znaczniki
CSS - Tutorial
CSS - Selektory
PHP
JavaScript

XML

XSLT

Bazy danych


SQL
SQLite
MySQL
PostgreSQL

 

 

Programowanie


C
C++
C#
Java
VisualBasic
Python

Linux


Podstawy Linuxa
Bash
Linuks artykuły

Windows


Excel funkcje
Windows wskazówki
Outlook

Pozotałe działy


Programy
Rozrywka

 

 

 

This email address is being protected from spambots. You need JavaScript enabled to view it.