Klasa Files

Klasa Files została wprowadzona w Javie 7 do pakietu NIO w celu uproszczenia wielu powtarzalnych operacji na plikach. Nie mieliście czasem takiego wrażenia, że po raz setny piszecie metodę do odczytania pliku wiersz po wierszu tylko po to, żeby móc operować na całym tekście? Klasa Files wybawia nas właśnie z takich czynności udostępniając spory zestaw statycznych metod do odczytu pliku w całości, kopiowania i przesuwania plików na dysku, sprawdzania rozmiary plików, czy listowania plików znajdujących się w podanym folderze.

Kurs Java

Tworzenie pliku z dodatkowymi atrybutami

Pliki w Javie można utworzyć korzystając z podstawowej klasy File, np.:

import java.io.File;
  import java.io.IOException;
  
  public class Main {
      public static void main(String[] args) throws IOException {
          File file = new File("C:/plik.txt");
          if(!file.exists()) {
              file.createNewFile();
          }
      }
  }

Od Javy 7 możemy skorzystać także z klasy Files:

import java.io.IOException;
  import java.nio.file.Files;
  import java.nio.file.Paths;
  
  public class Main {
      public static void main(String[] args) throws IOException {
          Files.createFile(Paths.get("C:/plik.txt"));
      }
  }

Jeżeli plik już istnieje, rzucony zostaje wyjątek FileAlreadyExistsException . Należy zwrócić uwagę, że metoda createFile() nie przyjmuje Stringa, ale obiekt klasy implementującej interfejs Path oraz opcjonalne atrybuty pliku.

Tworzenie folderu

Foldery tworzymy z pomocą klasy Files z podobny sposób jak pliki, jednak wykorzystujemy do tego celu metodę createDirectory().

import java.io.IOException;
  import java.nio.file.Files;
  import java.nio.file.Paths;
  
  public class CreateDir {
      public static void main(String[] args) throws IOException {
          Files.createDirectory(Paths.get("C:/nowyFolder"));
      }
  }

Odczyt atrybutów pliku

Z pomocą klasy Files oraz dodatkowych interfejsów możemy odczytać praktycznie wszystkie informacje o pliku, zaczynając od nazwy, daty utworzenia i ostatniej modyfikacji, aż po szczegółowe informacje kontroli dostępu.

import java.io.IOException;
  import java.nio.file.Files;
  import java.nio.file.Paths;
  import java.nio.file.attribute.AclEntry;
  import java.nio.file.attribute.AclFileAttributeView;
  import java.nio.file.attribute.BasicFileAttributeView;
  import java.nio.file.attribute.BasicFileAttributes;
  import java.util.List;
  
  public class ReadAttributes {
      public static void main(String[] args) throws IOException {
          Files.createFile(Paths.get("C:/start/plik.txt"));
          BasicFileAttributeView attrView = 
                  Files.getFileAttributeView(Paths.get("C:/start/plik.txt"), BasicFileAttributeView.class);
          BasicFileAttributes attributes = attrView.readAttributes();
          System.out.println(attributes.size()); //rozmiar w bajtach
          System.out.println(attributes.lastModifiedTime()); //ostatnia modyfikacja
          
          AclFileAttributeView aclAttrView = 
                  Files.getFileAttributeView(Paths.get("C:/start/plik.txt"), AclFileAttributeView.class);
          List<AclEntry> acl = aclAttrView.getAcl();
          for (AclEntry aclEntry : acl) {
              aclEntry.flags().forEach(System.out::println);
              aclEntry.permissions().forEach(System.out::println);
              System.out.println(aclEntry.principal().getName());
          }
      }
  }

Wczytanie pliku w całości

Wczytywanie pliku w aplikacji jest powtarzalną czynnością. Najczęściej tworzymy do tego celu BufferedReadera, wczytujemy plik wiersz po wierszu i coś z takim tekstem robimy. Istnieje jednak sposób na wczytanie pliku w całości, wykorzystujemy w tym celu metodę Files.readAllLines().

import java.io.IOException;
  import java.nio.charset.Charset;
  import java.nio.file.Files;
  import java.nio.file.Paths;
  
  public class ReadAllLines {
      public static void main(String[] args) throws IOException {
          Files.readAllLines(Paths.get("C:/start/plik.txt"), Charset.forName("UTF-8"));
      }
  }

Rozwiązanie takie oszczędzi nam kilku linijek kodu. Nie należy tej metody wykorzystywać do wczytywania dużych plików.

Kopiowanie plików

Kopiowanie plików przed Javą 7 nie było zbyt wygodne i najczęściej musieliśmy je implementować ręcznie kopiując plik bajt po bajcie w pętli lub wykorzystać do tego celu zewnętrzną bibliotekę. Z pomocą klasy Files wystarczy wykorzystać metodę copy().

import java.io.IOException;
  import java.nio.file.Files;
  import java.nio.file.Paths;
  import java.nio.file.StandardCopyOption;
  
  public class CopyFiles {
      public static void main(String[] args) throws IOException {
          Files.copy(Paths.get("skąd"), Paths.get("dokąd"), StandardCopyOption.REPLACE_EXISTING);
      }
  }

Jako pierwszy argument metody copy() podajemy ścieżkę do pliku, który chcemy skopiować, jako drugi ścieżkę gdzie plik ma zostać skopiowany, dalej możemy wymienić opcjonalne atrybuty, np. to, że pliki mają być podmienione, jeżeli już istnieją w docelowej lokalizacji.

Przenoszenie plików

Przenoszenie plików realizujemy niemal identycznie jak kopiowanie, jednak z pomocą metody move().

import java.io.IOException;
  import java.nio.file.Files;
  import java.nio.file.Paths;
  import java.nio.file.StandardCopyOption;
  
  public class Main {
      public static void main(String[] args) throws IOException {
          Files.move(Paths.get("skąd"), Paths.get("dokąd"), StandardCopyOption.REPLACE_EXISTING);
      }
  }

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.