XI

Obsługa plików

Każdy użyteczny rogram nie może obejść się bez operacji na plikach. W Javie za obsługę plików i katalogów odpowiedzialna jest klasa File. Jeśli nasz program ma obsługiwać pliki, wówczas w kodzie źródłowym powinna znaleźć się instrukcja ładująca tą klasę:

import java.io.File;

lub

import java.io.*;

XI.1

Otwieranie i tworzenie plików

Na początek musimy nauczyć się otwierać oraz jeśli to konieczne również tworzyć nowe pliki. Kolejność postę-

powania jest następująca:

1. Deklarujemy użycie obiektu typu File, np.:

File plik;

2. Następnie definiujemy go używając konstruktora new podając jego nazwę: plik=new File(”dane.dat”);

Obiekt jest tworzony w katalogu, w którym znajduje się nasz program.

3. Tak utworzony obiekt nie jest jeszcze plikiem, zawiera on jedynie referencję do niego. Aby utworzyć plik należy użyć metody createNewFile():

boolean b=plik.createNewFile();

Metoda createNewFile zwraca wartość: true (jeśli operacja się powiodła) lub false (jeśli plik nie został utworzony). Metoda ta może zgłaszać błąd (exception) - IOException, który musimy obsłużyć (instrukcje try catch()).

Oprócz niej mamy także kilka innych metod służących do operacji tworzenia/kasowania plików: metoda

opis

File plik_1,plik_2,katalog;

boolean b;

plik_1=new File("dane.dat");

plik_2=new File("info.txt");

katalog=new File("Materialy");

b=plik 1.delete();

kasuje fizycznie plik dane.dat

b=plik 1.createNewFile();

tworzy plik, który od tej pory istnieje fizycznie w pamięci kompu-tera

b=plik 1.renameTo(plik 2);

zmienia nazwę pliku w obiekcie plik 1 na nazwę z obiektu plik 2

b=katalog.mkdir();

tworzy na dysku katalog Materialy

Aby przyjrzeć się bliżej stronie praktycznej zagadnienia, napiszmy program tworzący nowy plik i nowy katalog.

1

1

import java.io.*;

2

class tw_1{

3

4

public static void main(String[] args){

5

boolean b;

6

File plik=new File("halo.dat");

7

File katalog=new File("Nowy");

8

9

try{

10

b =plik.createNewFile();

11

}

12

catch(IOException e){

13

System.out.println("nie udalo sie utworzyc pliku"); 14

}

15

System.out.println(b);

16

b=katalog.mkdir();

17

System.out.println(b);

18

}

19

}

Uwagi:

• w linii 1 ładujemy klasę java.io.*

• W liniach 6 i 7 tworzymy obiekty typu File i referencje (halo.dat - nasz plik i Nowy - nasz katalog)

• W liniach 9-14 tworzymy nowy plik wraz z obsługą błędów. Jeśli z jakichkolwiek powodów plik nie zostanie utworzony, wówczas na ekranie wyświetli się napis:

”nie udalo sie utworzyc pliku”

• Jeśli plik zostanie poprawnie utworzony to na ekranie wyświetli się komunikat: true (linia 15)

• W linii 16 tworzony jest katalog Nowy. Komunikat świadczący o powodzeniu (true) lub niepowodzeniu (

false) tej operacji jest także wyświetlany na ekran monitora (linia 17) Pozostałe operacje wymienione w tabeli (zmiana nazwy i kasowanie pliku) zostały wykorzystane w kolejnym programie:

1

import java.io.*;

2

class tw_2{

3

4

public static void main(String[] args){

5

boolean a,b,c;

6

File plik_1=new File("plik_1.dat");

7

File plik_2=new File("plik_2.dat");

8

File plik_3=new File("plik_3.dat");

9

File plik_4=new File("plik_4.dat");

10

try{

11

a =plik_1.createNewFile();

12

b =plik_2.createNewFile();

13

c =plik_3.createNewFile();

14

}

15

catch(IOException e){

16

System.out.println("nie udalo sie"); 17

}

18

19

b=plik_2.delete();

20

c=plik_3.renameTo(plik_4);

21

2

22

23

if(plik_1.exists())System.out.println("plik "+plik_1.getName()+"

istnieje");

24

else System.out.println("plik

"+plik_1.getName()+"

skasowany");

25

26

if(plik_2.exists())System.out.println("plik "+plik_2.getName()+"

istnieje");

27

else System.out.println("plik

"+plik_2.getName()+"

skasowany");

28

29

if(plik_3.exists())System.out.println("plik "+plik_3.getName()+"

istnieje");

30

else System.out.println("plik

"+plik_3.getName()+"

skasowany");

31

32

if(plik_4.exists())System.out.println("plik "+plik_4.getName()+"

istnieje");

33

else System.out.println("plik

"+plik_4.getName()+"

skasowany");

34

}

35

}

Uwagi:

• Tworzymy 4 obiekty typu File (linie 6-9)

• W liniach 10-17 tworzymy 3 pliki: plik 1.dat,plik 2.dat,plik 3.dat

• W linii 19 kasujemy plik 2.dat

• W linii 20 zmieniamy nazwę pliku: plik 3.dat na plik 4.dat (plik 4.dat nie jest plikem, który istnieje fizycznie na dysku).

• W liniach 23-33 znajdują się instrukcje wypisujące informacje o obiektach typu File, należy je porównać z plikami jakie zostały utworzone w katalogu.

XI.2

Własności plików

Każdy plik posiada własności, które np. określają rodzaj dostępu, rozmiar itp. Własności te możemy odczytać i oczywiście wykorzystać do własnych potrzeb.

metoda

opis

File plik;

boolean b;

long l;

plik=new File("dane.dat");

b=plik.exists();

określa czy plik fizycznie już istnieje (true) lub nie (false) b=plik.isFile();

true jeśli obiekt jest plikem, false jeśli nie (np. katalog) b=plik.isDirectory();

true jeśli obiekt jest katalogiem, false jeśli nim nie jest s=plik.getName();

podaje nazwę pliku lub katalogu (przydatne gdy mamy tablicę zawierającą nazwy plików)

b=plik.canRead();

true jeśli możemy czytać plik, false jeśli nie możemy b=plik.canWrite();

true jeśli możemy pisać do pliku, false jeśli nie mozemy b=plik.isHidden();

true jeśli plik ma atrybut: ukryty, false w przeciwnym przypadku l=plik.length();

zwraca rozmiar pliku w bajtach

b=plik.setReadOnly();

zmiana sposobu dostępu do pliku - plik tylko do odczytu Powyższe metody wykorzystamy do odczytu i zmiany własności tworzonego w programie pliku.

1

import java.io.*;

2

class att{

3

3

4

public static void main(String[] args){

5

boolean b;

6

File plik=new File("dane.dat");

7

8

b=plik.exists();

9

if(!b){

10

try{

11

b=plik.createNewFile();

12

}

13

catch(IOException e){

14

System.out.println("nie udalo sie"); 15

}

16

}

17

18

//odczytanie parametrow

19

if(plik.isFile())System.out.println(plik.getName()+" to plik"); 20

if(plik.canRead())System.out.println("mozna go czytac"); 21

if(plik.canWrite())System.out.println("mozna w nim pisac"); 22

if(plik.isHidden())System.out.println("plik jest ukryty"); 23

System.out.println("rozmiar pliku w bajtach: "+plik.length()); 24

b=plik.setReadOnly();

25

if(plik.canWrite())System.out.println("mozna w nim pisac"); 26

}

27

}

Uwagi:

• W linii 8 sprawdzamy czy plik fizycznie istnieje, jeśli nie to tworzymy go (linie 9-16)

• W linii 24 zmieniamy sposób dostępu do pliku - od tego miejsca z pliku można tylko czytać. Dlatego komentarz z linii 25 nie wyświetla się na ekranie.

XI.3

Ścieżki, listy plików, konstruktor ze ścieżką Oprócz wymienionych wyżej metod Java pozwala nam także określić pełną (absolutną) ścieżkę do katalogu, w którym znajduje się plik. Co więcej, przy tworzeniu obiektu typu File możemy też określić tę ścieżkę - wówczas tworzony plik zostanie tam umieszczony. Ponadto mamy w Javie możliwość pobrania listy plików jakie znajdują się w określonym katalogu. Dzięki temu możemy operować na tych plikach wykorzystując pętle. Metody, które umożliwiają nam wykonywanie tych operacji opisane są w poniższej tabeli.

4

metoda

opis

File plik;

File[] lista_file;

String[] lista_string;

File katalog=new File("Kategoria");

String sciezka, nazwa_pliku;

sciezka =plik.getAbsolutePath();

podaje absolutną ścieżkę dostępu do pliku

plik=new File(sciezka, nazwa pliku);

tworzy obiekt typu File w miejscu wskazanym w ścieżce list string =katalog.list();

Tablica typu String zawierająca listę plików/podkatalogów znajdujących się w określonym katalogu

list file =katalog.listFiles();

Tablica

obiektów

typu

File

zawierająca

listę

pli-

ków/podkatalogów

znajdujących

się

w

określonym

katalogu

Poniższy program wykorzystuje powyższe metody do następujących operacji: 1. stworzenia katalogu i umieszczenia w nim kilku plików z rozszerzeniem ”dat”

2. odczytania listy plików zawartych w katalogu i wypisania ich nazw na ekran 3. zmiany rozszerzenia istniejących plików z ”dat” na ”txt”

1

import java.io.*;

2

class arr{

3

4

public static void main(String[] args){

5

boolean a;

6

String s,nazwa,stara_nazwa;

7

int i,x;

8

File plik;

9

File[] lista_file;

10

String[] lista_string;

11

File katalog=new File("Pliki");

12

13

//czesc 1: tworzymy katalog i umieszczamy w nim kilka plikow 14

a=katalog.mkdir();

15

s =katalog.getAbsolutePath();

16

17

18

for(i=1;i<10;i++){

19

nazwa="dane"+"_"+String.valueOf(i)+".dat"; 20

plik=new File(s, nazwa);

21

try{

22

a =plik.createNewFile();

23

}

24

catch(IOException e){

25

System.out.println("plik: "+nazwa+" nie zostal utworzony"); 26

}

27

}

5

28

//czesc 2 sprawdzamy zawartosc katalogu i wypisujemy na ekran 29

30

lista_string=katalog.list();

31

for(i=0;i<lista_string.length;i++)System.out.println(lista_string[i]); 32

//czesc 3 pobieramy wszystkie pliki i zmieniamy ich rozszerzenia z: "dat" na "txt"

33

34

lista_file=katalog.listFiles();

35

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

36

stara_nazwa=lista_file[i].getName();

37

x=stara_nazwa.length()-3;

38

nazwa=stara_nazwa.substring(0,x)+"txt"; 39

plik=new File(s,nazwa);

40

a=lista_file[i].renameTo(plik);

41

if(!a)lista_file[i].delete();

42

}

43

44

}

45

}

Uwagi:

• W linii 15 odczytujemy pełną ścieżkę do katalogu ”Pliki”

• Nazwy plików generujemy w pętli for() umieszczając w nazwie numer iteracji (linia 19)

• W linii 20 tworzymy pliki podając ścieżkę do katalgu, w którym mają zostać umieszczone.

• W linii 30 pobieramy listę plików zawartych w katalogu Pliki. Tablica zawierająca listę jest typu String.

• W linii 34 pobierana jest lista plików z katalogu. Tablica przechowująca tą listę jest typu File.

• W liniach 35-42 dokonywana jest seryjna zmiana rozszerzenia plików z użyciem znanych już metod.

• W rezultacie w katalogu Pliki powinny znaleźć się tylko pliki z rozszeszeniem ”txt” mimo iż na początku tworzyliśmy pliki z innym rozszerzeniem.

6