JavaRush /Blog Jawa /Random-JV /File Jawa, Path

File Jawa, Path

Diterbitake ing grup
Hello! Dina iki kita bakal ngomong babagan nggarap file lan direktori. Sampeyan wis ngerti carane ngatur isi file: kita wis akèh kelas pengabdian kanggo iki :) Aku sampeyan bisa gampang ngelingi sawetara kelas sing perlu kanggo tujuan iki. Ing kuliah dina iki kita bakal ngomong khusus babagan manajemen file - nggawe, ngganti jeneng, lsp. Sadurunge Java 7, kabeh operasi kasebut ditindakake kanthi nggunakake File. Sampeyan bisa maca babagan karyane ing kene . Nanging ing Jawa 7, pangripta basa mutusake kanggo ngganti cara kerjane karo file lan direktori. Iki amarga kasunyatan sing kelas Filewis sawetara cacat. Contone, ora ana cara copy()sing ngidini sampeyan nyalin file saka siji lokasi menyang lokasi liyane (fitur sing katon jelas dibutuhake). Kajaba iku, kelas Filewis cukup akèh cara sing bali boolean-nilai. Yen ana kesalahan, cara kasebut ngasilake palsu tinimbang mbuwang pengecualian, sing nggawe kesalahan diagnosa lan nemtokake panyebabe angel banget. Tinimbang kelas siji, Fileminangka akeh minangka 3 kelas katon: Paths, Pathlan Files. Inggih, kanthi tepat, Pathiki antarmuka, dudu kelas. Ayo ngerteni kepiye bedane saben liyane lan sebabe saben wong dibutuhake. Ayo dadi miwiti karo bab sing paling gampang - Paths.

dalan

Pathsminangka kelas sing prasaja banget kanthi metode statis tunggal get(). Iki digawe mung kanggo njupuk obyek saka jinis saka string liwati utawa URI Path. Ora ana fungsi liyane. Punika conto karyanipun:
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 angel, ta? :) Inggih, amarga kita entuk jinis obyek Path, ayo ngerteni apa iku Pathlan kenapa dibutuhake :)

Path

Path, umume, minangka analog sing didesain ulang saka File. Iku luwih gampang kanggo nggarap tinimbang karo File. Kaping pisanan , akeh cara utilitas (statis) sing dicopot lan dipindhah menyang kelas Files. Kapindho , Pathnilai bali saka metode kasebut diurutake. Ing kelas, Filecara ngasilake iki String, iku boolean, iku File- iku ora gampang kanggo tokoh metu. Contone, ana cara getParent()sing ngasilake path induk kanggo file saiki minangka senar. Nanging ing wektu sing padha ana cara getParentFile()sing ngasilake barang sing padha, nanging ing wangun obyek File! Iki jelas keluwih. Mulane, ing antarmuka, Pathcara getParent()lan cara liya kanggo nggarap file mung ngasilake obyek Path. Ora ana akeh pilihan - kabeh gampang lan gampang. Apa cara sing migunani Path? Ing ngisor iki sawetara lan conto karyane:
  • getFileName()- ngasilake jeneng berkas saka path;

  • getParent()- ngasilake direktori "wong tuwa" sing ana hubungane karo path saiki (yaiku, direktori sing luwih dhuwur ing wit direktori);

  • getRoot()- ngasilake direktori "root"; yaiku, sing ana ing ndhuwur wit direktori;

  • startsWith(), endsWith()- mriksa apa path diwiwiti / rampung 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 cara kerjane endsWith(). Iku mriksa yen path saiki rampung karo path liwati . Iku ing path , lan ora ing pesawat saka karakter .

    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:

    palsu
    bener

    Sampeyan kudu pass path lengkap kanggo cara endsWith(), lan ora mung pesawat saka karakter: digunakake asil bakal tansah palsu , sanajan path saiki bener ends karo kuwi urutan karakter (kaya ing kasus "estFile.txt ” ing conto ing ndhuwur).

    Kajaba iku, ana Pathklompok cara sing nyederhanakake nggarap path absolut (lengkap) lan relatif .

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

    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:

    bener

  • Path normalize()- "normalizes" dalan saiki, mbusak unsur sing ora perlu saka iku. Sampeyan bisa uga ngerti manawa sistem operasi populer asring nggunakake karakter "." nalika nuduhake path. ("direktori saiki") lan ".." (direktori induk). Contone: " ./Pictures/dog.jpg " tegese ing direktori kita saiki, ana folder Pictures, lan ing kono ana file "dog.jpg"

    Dadi ing kene. Yen program sampeyan duwe path sing nggunakake "." utawa "..", cara kasebut normalize()bakal mbusak lan entuk dalan 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 path saiki lan 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:

    Jeneng pangguna\Desktop\testFile.txt

Dhaptar lengkap cara Pathcukup gedhe. Sampeyan bisa nemokake kabeh ing dokumentasi Oracle . Kita bakal nerusake kanggo review Files.

File

Files- Iki minangka kelas sarana ing ngendi metode statis saka kelas kasebut dipindhah File. Files- iki kira-kira padha Arraysutawa Collections, mung dianggo karo file, lan ora karo susunan lan koleksi :) Iku fokus ing ngatur file lan direktori. Nggunakake metode statis Files, kita bisa nggawe, mbusak lan mindhah file lan direktori. Kanggo operasi iki cara digunakake createFile()(kanggo direktori - createDirectory()), move()lan delete(). 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 {

       //file creation
       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 directory
       Path testDirectory = Files.createDirectory(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory"));
       System.out.println("Was the directory successfully created?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory")));

       //move file from desktop to testDirectory. You need to move with the name of the file in the folder!
       testFile1 = Files.move(testFile1, Paths.get("C:\\Users\\Username\\Desktop\\testDirectory\\testFile111.txt"), REPLACE_EXISTING);

       System.out.println("Is our file left 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")));

       //remove 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 (metode Files.createFile()) dhisik ing desktop, banjur nggawe folder ing kana (metode Files.createDirectory()). Sawise iku, kita mindhah file (metode Files.move()) saka desktop menyang folder anyar iki, lan ing pungkasan kita mbusak file kasebut (metode Files.delete()). Output konsol: Apa file kasebut kasil digawe? bener Apa direktori digawe kasil? bener Apa file kita isih ana ing desktop? palsu Apa file kita wis dipindhah menyang testDirectory? bener Apa file isih ana? palsu Pay manungsa waé:Kaya cara antarmuka Path, akeh cara Filesngasilake obyekPath . Umume metode kelas Filesuga nampa Path. Ing kene cara bakal dadi asisten sing setya Paths.get()- gunakake kanthi aktif. Apa maneh sing menarik Files? Sing ora ana kelas lawas yaiku metode ! File. copy()Kita ngomong babagan dheweke ing awal kuliah, saiki wektune kanggo 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 {

       //file creation
       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 directory
       Path testDirectory2 = Files.createDirectory(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2"));
       System.out.println("Was the directory successfully created?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2")));

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

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

       System.out.println("Has our file been copied to testDirectory?");
       System.out.println(Files.exists(Paths.get("C:\\Users\\Username\\Desktop\\testDirectory2\\testFile111.txt")));
   }
}
Output konsol: Apa file kasebut kasil digawe? bener Apa direktori digawe kasil? bener Apa file kita isih ana ing desktop? bener Apa file kita disalin menyang testDirectory? bener Saiki sampeyan bisa nyalin file kanthi program! :) Nanging kelas Filesngijini sampeyan ora mung kanggo ngatur file dhewe, nanging uga bisa karo isine. Kanggo nulis data menyang file, wis cara write(), lan kanggo maca - minangka akeh minangka 3:, read()lan readAllBytes()Kita readAllLines() bakal manggon ing terakhir ing rinci. Kenapa ing? Amarga nduweni jinis bali sing menarik banget - List<String>! Yaiku, ngasilake dhaptar baris ing file kasebut. Mesthine, iki nggawe nggarap konten kasebut trep banget, amarga kabeh file, baris demi baris, bisa, contone, dadi output menyang konsol ing daur ulang 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: Aku ngelingi wayahe sing apik banget: Sampeyan katon ing ngarepku, Kaya sesanti fleeting, Kaya genius kaendahan murni. Nyaman banget! :) Fitur iki muncul ing Java 7. Ing Java 8, Stream API muncul , sing nambah sawetara unsur pemrograman fungsional menyang Jawa. Kalebu kemampuan sing luwih sugih kanggo nggarap file. Mbayangno yen kita duwe tugas: golek kabeh baris ing file sing diwiwiti karo tembung "Carane", Ngonversi menyang UPPER CASE lan output menyang console. Apa solusi nggunakake kelas Filesing Jawa 7 katon kaya? 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("How")) {
               String upper = s.toUpperCase();
               result.add(upper);
           }
       }

       for (String s: result) {
           System.out.println(s);
       }
   }
}
Output konsol: Kaya Wawasan Puasa, Kaya GENIUS saka kaendahan murni. Kita koyone wis rampung, nanging apa sampeyan ora mikir sing kanggo tugas prasaja kuwi kode kita dadi sethitik ... verbose? Nggunakake Java 8 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("How"))
               .map(String::toUpperCase)
               .collect(Collectors.toList());
       result.forEach(System.out::println);
   }
}
Kita entuk asil sing padha, nanging kanthi kode sing luwih murah! Menapa malih, iku ora bisa ngandika yen kita wis ilang ing "readability". Aku sampeyan bisa kanthi gampang menehi komentar babagan apa kode iki, sanajan sampeyan ora kenal karo Stream API. Nanging ing cendhak, Stream minangka urutan unsur sing sampeyan bisa nindakake fungsi sing beda-beda. Kita entuk obyek Stream saka metode kasebut Files.lines()banjur aplikasi 3 fungsi kasebut:
  1. Nggunakake metode kasebut, filter()kita mung milih baris kasebut saka file sing diwiwiti karo "Carane".

  2. Kita ngliwati kabeh baris sing dipilih kanthi nggunakake metode kasebut map()lan nyuda saben baris dadi UPPER CASE.

  3. Kita gabungke kabeh garis asil menyang Listnggunakake collect().

Ing metu kita entuk asil sing padha: KAYA PASAWAN PASA, KAYA GENIUS KECANTIKAN MURNI. Yen sampeyan kepengin sinau luwih akeh babagan kemampuan perpustakaan iki, disaranake maca artikel iki . Kita bakal bali menyang wedhus kita, yaiku, file :) Kemungkinan pungkasan sing bakal kita nimbang dina iki yaiku mlaku liwat wit file . Struktur file ing sistem operasi modern paling kerep dadi wit: duwe oyod lan ana cabang sing bisa dipisahake cabang liyane, lsp. Direktori nduweni peran root lan cabang. Contone, direktori " C: // " bisa tumindak minangka root . Loro cabang saka iku: " C: // Downloads " lan " C: // Pangguna ". Saka saben cabang kasebut ana 2 cabang liyane: " C://Downloads/Pictures ", " C://Downloads/Video ", " C://Users/JohnSmith ", " C://Users/Pudge2005 " . Cabang liyane metu saka cabang kasebut, lsp. - iki carane wit dadi metu. Ing Linux katon meh padha, mung ana direktori kasebut minangka root / File, Path - 2 Saiki mbayangno yen kita duwe tugas: ngerti direktori root, kita kudu ngliwati, goleki folder kabeh level lan golek file ing isi kasebut. dhewe butuh. Kita bakal nggoleki file sing ngemot baris "Iki file sing kita butuhake!" Direktori root kita bakal dadi folder "testFolder", sing ana ing desktop. Ing njerone ana isi ing ngisor iki: File, Path - 3Ing folder level1-a lan level1-b uga ana folder: File, Path - 4File, Path - 5Ing "folder tingkat kapindho" iki ora ana folder maneh, mung file individu: File, Path - 6File, Path - 7Kita bakal nemtokake 3 file kanthi konten sing disedhiyakake. perlu kanthi jeneng sing cetha - FileWeNeed1.txt , FileWeNeed2.txt, FileWeNeed3.txt Iki sing kudu ditemokake kanthi isi nggunakake Jawa. Kepiye carane bisa nindakake iki? Cara sing kuat banget kanggo nyabrang wit file bisa nylametake - Files.walkFileTree(). Punika ingkang kedah kita tindakaken. Pisanan, kita kudu FileVisitor. FileVisitoriku antarmuka khusus sing njlèntrèhaké kabeh cara kanggo traversing wit file. Khusus, kita bakal nyelehake logika ing kana kanggo maca isi file lan mriksa manawa ngemot teks sing dibutuhake. Iki bakal katon kaya kita FileVisitor:
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("Required file found!");
               System.out.println(file.toAbsolutePath());
               break;
           }
       }

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

  • visitFileFailed()- apa sing kudu ditindakake yen ora bisa ngetik file (ora ana akses, utawa alasan liyane);

  • postVisitDirectory()- logika sing kudu dieksekusi sawise ngetik folder.

Kita ora duwe logika kaya ngono, mula cukup kanggo kita SimpleFileVisitor. Logika ing cara kasebut visitFile()cukup prasaja: maca kabeh baris saka file kasebut, priksa manawa ngemot konten sing dibutuhake, lan yen mangkono, print path absolut menyang console. Siji-sijine baris sing bisa nyebabake masalah yaiku:
return FileVisitResult.CONTINUE;
Ing kasunyatan, kabeh iku prasaja. Ing kene kita mung njlèntrèhaké apa sing kudu ditindakake program sawise file kasebut dilebokake lan kabeh operasi sing dibutuhake wis rampung. Ing kasus kita, kita kudu terus ngliwati wit kasebut, mula kita milih pilihan kasebut CONTINUE. Nanging kita, contone, bisa duwe tugas liyane: kanggo nemokake ora kabeh file sing ngemot "Iki file kita perlu", nanging mung siji file kuwi . Sawise iki, program kasebut kudu mandheg. Ing kasus iki, kode kita bakal katon persis padha, nanging tinimbang break; badhe:
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: File sing dibutuhake wis ditemokake! C:\Users\Username\Desktop\testFolder\FileWeNeed1.txt File sing dibutuhake ditemokake! C:\Users\Username\Desktop\testFolder\level1-a\level2-aa\FileWeNeed2.txt File sing dibutuhake ditemokake! C:\Users\Username\Desktop\testFolder\level1-b\level2-bb\FileWeNeed3.txt Great, kita iya! :) Yen sampeyan pengin ngerti liyane babagan walkFileTree(), Aku nyaranake sampeyan artikel iki . Sampeyan uga bisa ngrampungake tugas cilik - ngganti SimpleFileVisitorkaro sing biasa FileVisitor, ngleksanakake kabeh 4 cara lan nggawe tujuan kanggo program iki. Contone, sampeyan bisa nulis program sing bakal mlebu kabeh tumindak: nampilake jeneng file utawa folder ing console sadurunge / sawise ngetik. Sing kabeh - nganti ketemu mengko! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION