Baza Wiedzy

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 Programowania 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);
        }
    }
    

    Zapisz się do newslettera

    Otrzymuj nasz Newsletter z przykładowymi pytaniami rekrutacyjnymi, wyzwaniami programistycznymi i nowościami ze świata Javy, a także informacje o nowych kursach i promocjach.

    Traktujemy Twoją prywatność poważnie. Nikomu nie udostępniamy Twojego maila no i zawsze możesz się wypisać.

    Komentarze do artykułu

    Wyłączyliśmy możliwość dodawania komentarzy. Poniżej znajdziesz archiwalne wpisy z czasów gdy strona była jeszcze hobbystycznym blogiem. Zapraszamy natomiast do zadawnia pytań i dyskusji na naszej grupe na facebooku.

    Szkolenie Java WrocławJavaStart na Youtube