1 klasaFiles

Klasa plików

Do pracy z plikami dostępna jest elegancka klasa narzędzi - java.nio.file.Files. Ma metody na każdą okazję. Wszystkie metody tej klasy są statyczne i operują na obiektach typu Path. Istnieje wiele metod, więc rozważymy tylko te główne:

metoda Opis
Path createFile(Path path)
Tworzy nowy plik ze ścieżkąpath
Path createDirectory(Path path)
Tworzy nowy katalog
Path createDirectories(Path path)
Tworzy wiele katalogów
Path createTempFile(prefix, suffix)
Tworzy plik tymczasowy
Path createTempDirectory(prefix)
Tworzy katalog tymczasowy
void delete(Path path)
Usuwa plik lub katalog, jeśli jest pusty
Path copy(Path src, Path dest)
Kopiuje plik
Path move(Path src, Path dest)
Przenosi plik
boolean isDirectory(Path path)
Sprawdza, czy ścieżka jest katalogiem, a nie plikiem
boolean isRegularFile(Path path)
Sprawdza, czy ścieżka jest plikiem, a nie katalogiem
boolean exists(Path path)
Sprawdza, czy obiekt w podanej ścieżce istnieje
long size(Path path)
Zwraca rozmiar pliku
byte[] readAllBytes(Path path)
Zwraca całą zawartość pliku jako tablicę bajtów
String readString(Path path)
Zwraca całą zawartość pliku jako łańcuch
List<String> readAllLines(Path path)
Zwraca całą zawartość pliku jako listę ciągów znaków
Path write(Path path, byte[])
Zapisuje tablicę bajtów do pliku
Path writeString(Path path, String str)
Zapisuje ciąg znaków do pliku
DirectoryStream<Path> newDirectoryStream(Path dir)
Zwraca kolekcję plików (i podkatalogów) z podanego katalogu

2. Utwórz pliki i katalogi

Tworzenie plików i katalogów jest bardzo łatwe. Zobaczmy na przykładach:

Kod Notatka
Files.createFile(Path.of("c:\\readme.txt"));
Tworzy plik
Files.createDirectory(Path.of("c:\\test"));
Tworzy katalog
Files.createDirectories(Path.of("c:\\test\\1\\2\\3"));
Tworzy katalog i wszystkie niezbędne podkatalogi, jeśli nie istnieją.

3. Kopiuj, przenieś i usuń

Kopiowanie, przenoszenie i usuwanie plików jest równie łatwe. Dotyczy to również katalogów, ale muszą być puste.

Kod Notatka
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("c:\\readme-copy.txt");
Files.copy(path1, path2);
Kopiuje plik
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("d:\\readme-new.txt");
Files.move(path1, path2);
Przenosi i zmienia nazwę pliku
Path path = Path.of("d:\\readme-new.txt");
Files.delete(path);
Usuwa plik

4. Sprawdzanie typu i istnienia pliku

Gdy masz ścieżkę podaną z zewnątrz, chciałbyś wiedzieć, czy jest to plik, czy katalog. No ogólnie: czy taki plik/katalog istnieje czy nie?

W tym celu istnieją również specjalne metody. Możesz także łatwo sprawdzić długość pliku:

Kod Notatka
Files.isRegularFile(Path.of("c:\\readme.txt"));
true
Files.isDirectory(Path.of("c:\\test"));
true
Files.exists(Path.of("c:\\test\\1\\2\\3"));
false
Files.size(Path.of("c:\\readme.txt"));
10112

5. Praca z zawartością pliku

Wreszcie, istnieje cała seria metod, które ułatwiają odczytywanie lub zapisywanie zawartości pliku. Przykład:

Kod Opis
Path path = Path.of("c:\\readme.txt");
List<String> list = Files.readAllLines(path);

for (String str : list)
   System.out.println(str);

Odczytaj zawartość pliku jako listę linii.

Wyświetlanie linii na ekranie


6. Pobieranie zawartości katalogu

Pozostaje najciekawsza metoda - pobieranie plików i podkatalogów w danym katalogu.

Jest do tego specjalna metoda - newDirectoryStream(), która zwraca specjalny obiekt typu DirectoryStream<Path>. Ma iterator (!), a za pomocą tego iteratora możesz pobrać wszystkie pliki i podkatalogi danego katalogu.

Wygląda łatwiej niż wygląda:

Kod Opis
Path path = Path.of("c:\\windows");

try (DirectoryStream<Path> files = Files.newDirectoryStream(path)) {
   for (Path path : files)
      System.out.println(path);
}


Uzyskaj obiekt z listą plików
Przejrzyj listę plików w pętli

Obiekt DirectoryStream<Path>ma dwie właściwości. Po pierwsze, ma iterator, który zwraca ścieżki do plików i możemy użyć tego obiektu wewnątrz pliku for-each.

Po drugie, ten obiekt jest strumieniem danych i musi zostać zamknięty za pomocą metody close()lub użyty wewnątrz try-with-resources.



7. MetodaFiles.newInputStream

Od wersji Java 5 klasy FileInputStreamFileOutputStreamuważane za przestarzałe. Jedną z ich wad było to, że kiedy tworzony jest obiekt tych klas, pliki są natychmiast tworzone na dysku. I potencjalnie wszystkie błędy związane z tworzeniem pliku są wyrzucane.

Następnie uznano, że nie jest to najlepsze rozwiązanie. Dlatego do tworzenia obiektów plikowych zaleca się stosowanie metod klasy użytkowej - java.nio.Files.

Oto porównanie starego podejścia do tworzenia plików i nowego:

Był
String src = "c:\\projects\\log.txt";
InputStream input = new FileInputStream( src );
Stało się
String src = "c:\\projects\\log.txt";
InputStream input = Files.newInputStream( Path.of( src ) );

Podobnie zamiennik dla FileOutputStream:

Był
String src = "c:\\projects\\log.txt";
OutputStream  output = new FileOutputStream( src );
Stało się
String src = "c:\\projects\\log.txt";
OutputStream  output = Files.newOutputStream( Path.of( src ) );