1. Filesklass

Filer klass

För att arbeta med filer finns det en smart verktygsklass — java.nio.file.Files. Den har metoder för alla tillfällen. Alla metoder i denna klass är statiska och fungerar på Path-objekt. Det finns många metoder, så vi kommer bara att överväga de viktigaste:

Metod Beskrivning
Path createFile(Path path)
Skapar en ny fil vars sökväg ärpath
Path createDirectory(Path path)
Skapar en ny katalog
Path createDirectories(Path path)
Skapar flera kataloger
Path createTempFile(prefix, suffix)
Skapar en temporär fil
Path createTempDirectory(prefix)
Skapar en tillfällig katalog
void delete(Path path)
Tar bort en fil eller katalog om den är tom
Path copy(Path src, Path dest)
Kopierar en fil
Path move(Path src, Path dest)
Flyttar en fil
boolean isDirectory(Path path)
Kontrollerar om sökvägen är en katalog och inte en fil
boolean isRegularFile(Path path)
Kontrollerar om sökvägen är en fil och inte en katalog
boolean exists(Path path)
Kontrollerar om ett objekt finns på den givna sökvägen
long size(Path path)
Returnerar filstorleken
byte[] readAllBytes(Path path)
Returnerar hela innehållet i en fil som en array av byte
String readString(Path path)
Returnerar hela innehållet i en fil som en sträng
List<String> readAllLines(Path path)
Returnerar hela innehållet i en fil som en lista med strängar
Path write(Path path, byte[])
Skriver en array av byte till en fil
Path writeString(Path path, String str)
Skriver en sträng till en fil
DirectoryStream<Path> newDirectoryStream(Path dir)
Returnerar en samling filer (och underkataloger) från den givna katalogen

2. Skapa filer och kataloger

Filer och kataloger är mycket enkla att skapa. Låt oss övertyga oss själva med några exempel:

Koda Notera
Files.createFile(Path.of("c:\\readme.txt"));
Skapar en fil
Files.createDirectory(Path.of("c:\\test"));
Skapar en katalog
Files.createDirectories(Path.of("c:\\test\\1\\2\\3"));
Skapar en katalog och alla nödvändiga underkataloger om de inte finns.

3. Kopiera, flytta och ta bort

Att kopiera, flytta och ta bort filer är lika enkelt. Detta gäller även kataloger, men de måste vara tomma.

Koda Notera
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("c:\\readme-copy.txt");
Files.copy(path1, path2);
Kopierar en fil
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("d:\\readme-new.txt");
Files.move(path1, path2);
Flyttar och byter namn på en fil
Path path = Path.of("d:\\readme-new.txt");
Files.delete(path);
Tar bort en fil

4. Kontrollera en fils typ och existens

När du har en sökväg som tillhandahålls av någon annan vill du veta om det är en fil eller en katalog. Och i allmänhet, finns en sådan fil/katalog eller inte?

Det finns speciella metoder för detta också. Du kan också enkelt ta reda på längden på en fil:

Koda Notera
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. Arbeta med filinnehåll

Slutligen finns det en hel rad metoder som gör det enkelt att läsa eller skriva innehållet i en fil. Exempel:

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

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

Läs innehållet i filen som en lista med strängar.

Visa strängarna


6. Hämta innehållet i en katalog

Den mest intressanta metoden finns fortfarande kvar. Den används för att hämta filer och underkataloger i en given katalog.

Vi pratar om newDirectoryStream()metoden, som returnerar ett speciellt DirectoryStream<Path>objekt. Den har en iterator(!) som du kan använda för att hämta alla filer och underkataloger i en given katalog.

Det här är lättare än det låter.

Koda Beskrivning
Path path = Path.of("c:\\windows");

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


Hämta ett objekt med en lista över filer
Bläddra över listan med filer

Objektet DirectoryStream<Path>har två egenskaper. För det första har den en iterator som returnerar filsökvägar, och vi kan använda det här objektet i en for-eachloop.

Och för det andra är det här objektet en dataström, så det måste explicit stängas med metoden, close()eller deklareras för användning i ett try-with-resourcesblock.



7. Files.newInputStreammetod

Från och med Java 5 har klasserna FileInputStreamoch FileOutputStreamfasats ut. En av deras nackdelar var att när objekt av dessa klasser skapas skapas filer omedelbart på disken. Och alla undantag relaterade till filskapande kan potentiellt kastas.

Senare erkändes detta som inte det bästa beslutet. Följaktligen rekommenderas det att använda metoderna i verktygsklassen java.nio.Filesför att skapa filobjekt.

Här är en jämförelse mellan den gamla metoden och den nya metoden för att skapa filer:

Innan
String src = "c:\\projects\\log.txt";
InputStream input = new FileInputStream(src);
Efter
String src = "c:\\projects\\log.txt";
InputStream input = Files.newInputStream( Path.of(src) );

Och det finns en liknande ersättning för FileOutputStream:

Innan
String src = "c:\\projects\\log.txt";
OutputStream  output = new FileOutputStream( src );
Efter
String src = "c:\\projects\\log.txt";
OutputStream  output = Files.newOutputStream( Path.of( src ) );