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
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
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
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
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
//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