CodeGym /Blog Jawa /Acak /File Jawa, Path
John Squirrels
tingkat
San Francisco

File Jawa, Path

Diterbitake ing grup
Hi! Dina iki kita bakal ngomong babagan nggarap file lan direktori. Sampeyan wis ngerti carane ngatur isi file: kita wis darmabakti akèh pawulangan kanggo iki :) Aku sampeyan nemokake iku gampang kanggo ngelingi sawetara kelas digunakake kanggo tujuan iki. Ing wulangan dina iki, kita bakal ngomong khusus babagan manajemen file: nggawe, ngganti jeneng, lsp. Sadurunge Java 7, kabeh operasi kasebut ditindakake nggunakake kelas File . Sampeyan bisa maca babagan kene . Nanging ing Java 7, pangripta basa mutusake kanggo ngganti cara kita nggarap file lan direktori. Iki kedadeyan amarga kelas File duwe sawetara kekurangan. Contone, ora duwe metode salinan () , sing ngidini sampeyan nyalin file saka siji lokasi menyang lokasi liyane (kemampuan sing penting). Kajaba iku, ingKelas file duwe sawetara cara sing ngasilake nilai boolean . Yen ana kesalahan, cara kasebut ngasilake palsu. Ora mbuwang pangecualian, dadi angel banget kanggo ngenali kesalahan lan diagnosa panyebabe. Ing panggonan kelas File siji , 3 kelas katon: Paths , Path , lan Files . Inggih, kanthi tepat, Path minangka antarmuka, dudu kelas. Ayo ngerteni carane beda-beda saka saben liyane lan apa sing kita butuhake. Ayo diwiwiti kanthi sing paling gampang: Paths .

dalan

Paths minangka kelas sing gampang banget kanthi metode statis tunggal: get() . Iki digawe mung kanggo entuk obyek Path saka string utawa URI sing dilewati. Ora ana fungsi liyane. Punika conto ing karya:

import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {

   public static void main(String[] args) {

       Path testFilePath = Paths.get("C:\\Users\\Username\\Desktop\\testFile.txt");
   }
}
Ora kelas sing paling kompleks, ta? :) Inggih, kita uga duwe jinis Path iki . Ayo ngerteni apa Path lan kenapa perlu :)

Path

Path , umume, minangka analog sing didesain ulang saka kelas File . Luwih gampang digarap tinimbang File . Pisanan , akeh cara sarana (statis) dijupuk lan dipindhah menyang kelas Files . Kapindho , supaya dileksanakake ing Nilai bali saka cara antarmuka Path . Ing kelas File , metode ngasilake String , utawa boolean , utawa File . Ora gampang ngerteni. Contone, ana cara getParent () sing ngasilake senar sing nuduhake path induk file saiki. Nanging ana uga ametode getParentFile () , sing ngasilake perkara sing padha nanging ing wangun obyek File ! Iki jelas keluwih. Mulane, ing antarmuka Path , metode getParent () lan cara liya kanggo nggarap file mung ngasilake obyek Path . Ora ana tumpukan pilihan - kabeh gampang lan gampang. Apa sawetara cara migunani sing diduweni Path ? Ing ngisor iki sawetara lan conto cara kerjane:
  • getFileName() : ngasilake jeneng berkas saka path;

  • getParent () : ngasilake direktori "wong tuwa" saka path saiki (kanthi tembung liya, direktori sing ana ing ndhuwur ing wit direktori);

  • getRoot() : ngasilake direktori "root", yaiku direktori ing ndhuwur wit direktori;

  • startsWith() , endsWith() : mriksa apa path diwiwiti/ends karo path liwati:

    
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class Main {
    
       public static void main(String[] args) {
    
           Path testFilePath = Paths.get("C:\\Users\\Username\\Desktop\\testFile.txt");
    
           Path fileName = testFilePath.getFileName();
           System.out.println(fileName);
    
           Path parent = testFilePath.getParent();
           System.out.println(parent);
    
           Path root = testFilePath.getRoot();
           System.out.println(root);
    
           boolean endWithTxt = testFilePath.endsWith("Desktop\\testFile.txt");
           System.out.println(endWithTxt);
    
           boolean startsWithLalala = testFilePath.startsWith("lalalala");
           System.out.println(startsWithLalala);
       }
    }
    

    Output konsol:

    
    testFile.txt
    C:\Users\Username\Desktop
    C:\
    true
    false
    

    Pay manungsa waé kanggo cara endsWith () dianggo. Iku mriksa apa path saiki rampung karo path liwati . Khususe, manawa ana ing dalan , ora ana ing senar sing dilewati .

    Bandhingake asil saka rong telpon iki:

    
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class Main {
    
       public static void main(String[] args) {
    
           Path testFilePath = Paths.get("C:\\Users\\Username\\Desktop\\testFile.txt");
    
           System.out.println(testFilePath.endsWith("estFile.txt"));
           System.out.println(testFilePath.endsWith("Desktop\\testFile.txt"));
       }
    }
    

    Output konsol:

    
    false
    true
    

    Ing endsWith () cara kudu liwat path asli, ora mung pesawat saka karakter: yen ora, asil bakal tansah palsu, sanajan path saiki tenan ends karo urutan karakter (minangka kasus karo "estFile.txt "ing conto ing ndhuwur).

    Kajaba iku, Path duwe klompok metode sing nyederhanakake nggarap path absolut (lengkap) lan relatif .

Ayo ndeleng cara iki:
  • boolean isAbsolute() ngasilake bener yen path saiki absolut:

    
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class Main {
    
       public static void main(String[] args) {
    
           Path testFilePath = Paths.get("C:\\Users\\Username\\Desktop\\testFile.txt");
    
           System.out.println(testFilePath.isAbsolute());
       }
    }
    

    Output konsol:

    
    true
    
  • Path normalize () : "normalizes" path saiki, mbusak unsur sing ora perlu saka iku. Sampeyan bisa uga ngerti yen ing sistem operasi populer simbol "." (direktori saiki) lan ".." (direktori induk) asring digunakake kanggo nemtokake path. Contone, " ./Pictures/dog.jpg " tegese direktori saiki duwe folder "Pictures", sing uga ngemot file "dog.jpg".

    Delengen kene. Yen path nggunakake "." utawa ".." katon ing program sampeyan, cara normalize () bakal mbusak lan ngasilake path sing ora ngemot:

    
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class Main {
    
       public static void main(String[] args) {
    
          
           Path path5 = Paths.get("C:\\Users\\Java\\.\\examples");
          
           System.out.println(path5.normalize());
          
           Path path6 = Paths.get("C:\\Users\\Java\\..\\examples");
           System.out.println(path6.normalize());
       }
    }
    

    Output konsol:

    
    C:\Users\Java\examples
    C:\Users\examples
    
  • Path relativize () : ngitung path relatif antarane saiki lan path liwati.

    Tuladhane:

    
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class Main {
    
       public static void main(String[] args) {
    
           Path testFilePath1 = Paths.get("C:\\Users\\Users\\Users\\Users");
           Path testFilePath2 = Paths.get("C:\\Users\\Users\\Users\\Users\\Username\\Desktop\\testFile.txt");
    
           System.out.println(testFilePath1.relativize(testFilePath2));
       }
    }
    

    Output konsol:

    
    Username\Desktop\testFile.txt
    

Dhaptar lengkap cara Path cukup dawa. Sampeyan bisa nemokake kabeh ing dokumentasi Oracle . Saiki kita bakal nerusake kanggo nimbang Files .

File

File minangka kelas sarana sing ngemot metode statis sing dijupuk saka kelas File . File bisa dibandhingake karo Arrays utawa Collections . Bentenipun iku bisa karo file, ora susunan utawa koleksi :) Iku fokus ing ngatur file lan direktori. Nggunakake metode statis saka kelas File , kita bisa nggawe, mbusak, lan mindhah file lan direktori. Operasi iki dileksanakake nggunakake createFile () (kanggo direktori, createDirectory () ), pamindhahan () , lan mbusak () cara. Mangkene carane nggunakake:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;

public class Main {

   public static void main(String[] args) throws IOException {

       // Create a file
       Path testFile1 = Files.createFile(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt"));
       System.out.println("Was the file created successfully?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt")));

       // Create a directory
       Path testDirectory = Files.createDirectory(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory"));
       System.out.println("Was the directory created successfully?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory")));

       // Move the file from the desktop to the testDirectory directory. When you move a folder, you need to indicate its name in the folder!
       testFile1 = Files.move(testFile1, Paths.get("C:\\Users\\Username\\Desktop\\testDirectory\\testFile111.txt"), REPLACE_EXISTING);

       System.out.println("Did our file remain on the desktop?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt")));

       System.out.println("Has our file been moved to testDirectory?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory\\testFile111.txt")));

       // Delete a file
       Files.delete(testFile1);
       System.out.println("Does the file still exist?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory\\testFile111.txt")));
   }
}
Ing kene kita nggawe file ( Files.createFile() method) ing desktop. Banjur kita nggawe folder ing lokasi sing padha ( Files.createDirectory () cara). Sawisé iku, kita mindhah file ( Files.move () cara) saka desktop kanggo folder anyar iki, lan pungkasanipun kita mbusak file ( Files.delete () cara). Output konsol:

Was the file created successfully? 
true 
Was the directory created successfully? 
true
Did our file remain on the desktop? 
false 
Has our file been moved to testDirectory? 
true 
Does the file still exist? 
false
Cathetan:kaya cara antarmuka Path, akeh metode kelas FilesngasilakePath obyek. Umume metode kelas Filesuga njupuk Pathobyek minangka input. Ing kene cara kasebut Paths.get()bakal dadi asisten sing setya - gunakake kanthi apik. Apa maneh sing menarik Files? FileApa sing ora ana kelas lawas yaiku copy()metode! Kita ngomong babagan iki ing wiwitan pelajaran iki. Saiki wektune ketemu!

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;

public class Main {

   public static void main(String[] args) throws IOException {

       // Create a file
       Path testFile1 = Files.createFile(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt"));
       System.out.println("Was the file created successfully?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt")));

       // Create a directory
       Path testDirectory2 = Files.createDirectory(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2"));
       System.out.println("Was the directory created successfully?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2")));

       // Copy the file from the desktop to the testDirectory2 directory.
       testFile1 = Files.copy(testFile1, Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2\\testFile111.txt"), REPLACE_EXISTING);

       System.out.println("Did our file remain on the desktop?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testFile111.txt")));

       System.out.println("Was our file copied to testDirectory?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2\\testFile111.txt")));
   }
}
Output konsol:

Was the file created successfully? 
true 
Was the directory created successfully? 
true 
Did our file remain on the desktop? 
true 
Was our file copied to testDirectory? 
true
Saiki sampeyan ngerti carane nyalin file kanthi program! :) Mesthi, Fileskelas ngijini sampeyan ora mung ngatur file dhewe, nanging uga bisa karo isine. Wis write()cara kanggo nulis data menyang file, lan kabeh 3 cara kanggo maca data: read(), readAllBytes(), lan readAllLines() Kita bakal manggon ing rinci ing pungkasan. Kok ngono? Amarga nduweni jinis bali sing menarik banget List<String>:! Yaiku, ngasilake dhaptar kabeh baris ing file kasebut. Mesthine, iki nggawe trep banget kanggo nggarap isi file, amarga kabeh file, baris demi baris, bisa, contone, ditampilake ing konsol nggunakake loop biasa for:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

import static java.nio.charset.StandardCharsets.UTF_8;

public class Main {

   public static void main(String[] args) throws IOException {

       List<String> lines = Files.readAllLines(Paths.get("C:\\Users\\Username\\Desktop\\pushkin.txt"), UTF_8);

       for (String s: lines) {
           System.out.println(s);
       }
   }
}
Output konsol:

I still recall the wondrous moment: 
When you appeared before my sight, 
As though a brief and fleeting omen, 
Pure phantom in enchanting light.
Super trep! :) Kemampuan iki muncul ing Java 7. Stream API muncul ing Java 8. Iki nambah sawetara unsur pemrograman fungsional ing Jawa. Kalebu kemampuan nangani file sing luwih sugih. Mbayangno yen kita duwe tugas ing ngisor iki: golek kabeh baris sing diwiwiti karo tembung "Minangka", Ngonversi menyang UPPERCASE, lan nampilake ing console. Apa solusi nggunakake Fileskelas katon kaya ing Jawa 7? Kaya iki:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

import static java.nio.charset.StandardCharsets.UTF_8;

public class Main {

   public static void main(String[] args) throws IOException {

       List<String> lines = Files.readAllLines(Paths.get("C:\\Users\\Username\\Desktop\\pushkin.txt"), UTF_8);

       List<String> result = new ArrayList<>();

       for (String s: lines) {
           if (s.startsWith("As")) {
               String upper = s.toUpperCase();
               result.add(upper);
           }
       }

       for (String s: result) {
           System.out.println(s);
       }
   }
}
Output konsol:

AS THOUGH A BRIEF AND FLEETING OMEN, 
PURE PHANTOM IN ENCHANTING LIGHT.
Misi wis rampung, nanging apa sampeyan ora mikir yen kanggo tugas sing prasaja kaya ngono, kode kita dadi sithik ... verbose? Nggunakake Java 8's Stream API, solusi kasebut katon luwih elegan:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {

   public static void main(String[] args) throws IOException {

       Stream<String> stream = Files.lines(Paths.get("C:\\Users\\Username\\Desktop\\pushkin.txt"));

       List<String> result  = stream
               .filter(line -> line.startsWith("As"))
               .map(String::toUpperCase)
               .collect(Collectors.toList());
       result.forEach(System.out::println);
   }
}
Kita entuk asil sing padha, nanging kanthi kode sing luwih murah! Apa maneh, ora ana sing bisa ngomong yen kita wis ilang "keterbacaan". Aku sampeyan bisa kanthi gampang menehi komentar babagan kode iki, sanajan ora kenal karo Stream API. Cekakipun, Stream minangka urutan unsur, ing ngendi sampeyan bisa nindakake macem-macem operasi. Kita entuk obyek Stream saka Files.lines()metode kasebut, banjur aplikasi 3 fungsi kasebut:
  1. Kita nggunakake filter()cara kanggo milih mung baris kasebut saka file sing diwiwiti karo "Minangka".

  2. Kita mlaku liwat kabeh garis sing dipilih kanthi nggunakake map()metode kasebut lan ngowahi saben dadi UPPERCASE.

  3. Kita nggunakake collect()cara kanggo ngumpulake kabeh baris ditampa menyang a List.

Kita entuk output sing padha:

AS THOUGH A BRIEF AND FLEETING OMEN, 
PURE PHANTOM IN ENCHANTING LIGHT.
Saiki ayo bali menyang roti lan mentega, yaiku file :) Kemampuan pungkasan sing bakal ditimbang saiki yaiku mlaku liwat wit file . Ing sistem operasi modern, struktur file paling kerep katon kaya wit: nduweni oyod lan ana cabang, sing bisa duwe cabang liyane, lan liya-liyane. Oyod lan cabang minangka direktori. Contone, direktori " С: // " bisa dadi root. Iki kalebu rong cabang: " C: // Downloads " lan " C: // Users ". Saben cabang iki nduweni rong cabang: " C://Downloads/Pictures ", " C://Downloads/Video ", " C://Users/JohnSmith ", " C://Users/Pudge2005". Lan cabang-cabang iki siji-sijine duwe cabang liyane, lan liya-liyane lan mulane diarani wit. Ing Linux, strukture padha, nanging direktori / minangkaFile, Path - 2 root. Saiki bayangake yen kita kudu miwiti ing direktori root. , lumaku liwat kabeh folder lan subfolder, lan golek file sing nduweni isi tartamtu. Kita bakal nggoleki file sing ngemot baris "Iki file sing kita butuhake!" Kita bakal njupuk folder "testFolder", sing ana ing desktop, minangka direktori root. Iki isine: File, Path - 3Folder level1-a lan level1-b uga ngemot folder: File, Path - 4File, Path - 5Ora ana folder ing "folder tingkat kapindho", mung file individu: File, Path - 6File, Path - 7File 3 kanthi isi sing kita butuhake sengaja diwenehi jeneng panjelasan: FileWeNeed1.txt, FileWeNeed2.txt, FileWeNeed3.txt. Iki persis file sing kudu ditemokake nggunakake Java. Kepiye carane nindakake iki? Cara sing kuat banget kanggo nyabrang wit file mbantu kita: Files.walkFileTree (). Punika ingkang kedah kita tindakaken. Pisanan, kita kudu a FileVisitor. FileVisitorpunika antarmuka khusus, kang cara kanggo traversing wit file diterangake. Utamane, ing kono kita bakal nemtokake logika kanggo maca isi file lan mriksa manawa ngemot teks sing dibutuhake. Mangkene FileVisitortampilan kita:

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.List;

public class MyFileVisitor extends SimpleFileVisitor<Path> {

   @Override
   public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {

       List<String> lines = Files.readAllLines(file);
       for (String s: lines) {
           if (s.contains("This is the file we need")) {
               System.out.println("We found a file we need!");
               System.out.println(file.toAbsolutePath());
               break;
           }
       }

       return FileVisitResult.CONTINUE;
   }
}
Ing kasus iki, kelas kita warisan SimpleFileVisitor. Iki minangka kelas sing ngleksanakake FileVisitor, ing ngendi kita kudu ngilangi mung siji cara: visitFile(). Ing kene kita nemtokake apa sing kudu ditindakake saben file ing saben direktori. Yen sampeyan butuh logika sing luwih rumit kanggo ngliwati struktur file, sampeyan kudu nulis implementasine dhewe saka FileVisitor. Sampeyan kudu ngetrapake 3 cara liyane ing kelas kasebut:
  • preVisitDirectory(): logika kanggo nglakokake sadurunge ngetik folder;

  • visitFileFailed(): logika kanggo nglakokake yen file ora bisa dibukak (ora ana akses, utawa kanggo alasan liyane);

  • postVisitDirectory(): logika kanggo nglakokake sawise ngetik folder.

Kita ora butuh logika kaya ngono, mula ora ana masalah SimpleFileVisitor. Logika ing visitFile()cara kasebut cukup prasaja: maca kabeh baris ing file kasebut, priksa manawa ngemot konten sing dibutuhake, lan yen mangkono, print path absolut ing console. Siji-sijine baris sing bisa nyebabake sampeyan angel yaiku:

return FileVisitResult.CONTINUE;
Bener, iki prasaja banget. Ing kene kita mung nerangake apa sing kudu ditindakake program sawise file dibukak lan kabeh operasi sing dibutuhake wis ditindakake. Ing kasus kita, kita pengin terus ngliwati wit kasebut, mula kita milih CONTINUEpilihan kasebut. Nanging, minangka alternatif, kita bisa uga duwe tujuan sing beda: tinimbang nemokake kabeh file sing ngemot "Iki file sing dibutuhake", golek mung siji file kasebut . Sawise iku, program kudu mungkasi. Ing kasus iki, kode kita bakal katon persis padha, nanging tinimbang break bakal ana:

return FileVisitResult.TERMINATE;
Inggih, ayo mbukak kode lan ndeleng apa bisa.

import java.io.IOException;
import java.nio.file.*;

public class Main {

   public static void main(String[] args) throws IOException {

       Files.walkFileTree(Paths.get("C:\\Users\\Username\\Desktop\\testFolder"), new MyFileVisitor());
   }
}
Output konsol:

We found a file we need! 
C:\Users\Username\Desktop\testFolder\FileWeNeed1.txt 
We found a file we need! 
C:\Users\Username\Desktop\testFolder\level1-a\level2-a-a\FileWeNeed2.txt 
We found a file we need! 
C:\Users\Username\Desktop\testFolder\level1-b\level2-b-b\FileWeNeed3.txt
Banget! Iku bisa! :) Sampeyan uga bisa nampa tantangan cilik iki: ngganti SimpleFileVisitorkaro biasa FileVisitor, override kabeh 4 cara, lan teka munggah karo tujuan dhewe kanggo program. Contone, sampeyan bisa nulis program sing nyathet kabeh tumindake: nampilake jeneng file utawa folder sadurunge utawa sawise ngetik. Semono wae. Sampai jumpa lagi! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION