Antarmuka jalur
1. Path mewakili urutan nama direktori, diikuti dengan nama file. Ketika komponen pertama di jalur adalah komponen root, itu adalah jalur absolut, seperti / atau c: /, dan komponen root yang diizinkan diakses tergantung pada sistem file;
2. Jalur yang dimulai dengan komponen root adalah jalur absolut, jika tidak, itu adalah jalur relatif;
3. Metode Statis Paths.get menerima satu atau lebih string, dan string secara otomatis dihubungkan oleh pemisah path dari sistem file default (UNIX IS /, Windows IS /), yang memecahkan masalah lintas platform. Kemudian parse hasil yang terhubung. Jika itu bukan jalur hukum, pengecualian yang tidak validpathexception akan dilemparkan, jika tidak objek jalur akan dikembalikan;
// Misalkan itu adalah path sistem file unix absolute = paths.get ("/home", "cat"); // Path Path Absolute Relative = pahts.get ("ixenos", "config", "user.properties"); // jalur relatif4. Dapatkan objek jalur dari jalur string
Dapatkan juga bisa mendapatkan seluruh jalur (mis. Satu string yang terdiri dari beberapa komponen), misalnya, baca jalur dari file konfigurasi:
String berbasis = properties.getProperty ("base.dir"); // dapat diperoleh/opt/ixenos atau c:/file program/ixenos path basepath = paths.get (berbasis);5. Menggabungkan atau penguraian jalur
1) Memanggil P.Resolve (q) akan mengembalikan jalur sesuai dengan aturan berikut: Jika Q adalah jalur absolut, kembalikan Q, jika tidak, jalur yang ditambahkan akan mengembalikan P/Q atau P/Q
Path workrelative = paths.get ("work"); Path Workpath = Basepath.resolve (workrelative); // Resolve juga dapat menerima parameter string jalur kerja = basepath.resolve ("work");2) Memanggil p.eResolvesibling ("q") akan menyelesaikan jalur induk o dari jalur yang ditentukan dan menghasilkan jalur saudara o/q
Path Temppath = workpath.resolvesibling ("temp"); / * Jika workpath adalah/opt/ixenos/work, maka/opt/ixenos/temp akan dibuat */3) Memanggil P. Relativize (R) akan menghasilkan jalur yang berlebihan q. Parsing Q akan menghasilkan jalur relatif r. Pada akhirnya, R tidak mengandung jalur persimpangan dengan p.
/* patha is/home/misty pathb adalah/home/ixenos/config sekarang patha telah relativized pathB, yang akan menghasilkan jalur redundan*/path PATTC = patha.relativize (pathb); // Saat ini, pathc adalah ../ixenos/config/* metode normalisasi akan menghapus bagian berlebihan*/path Pathd = pathc.normalize (); // pathd is/ixenos/config
4) Toabsolutepath akan menghasilkan jalur absolut dari jalur yang diberikan, mulai dari komponen root
5) Kelas jalur juga memiliki beberapa metode yang berguna untuk memutuskan dan menggabungkan jalur, seperti getParent, getFileName, getroot // dapatkan direktori root
6) Path memiliki metode yang baik untuk menangani kelas file warisan, dan kelas file juga memiliki metode Topath
Kelas Alat File
1. Baca dan tulis file
Metode Signature:
Statis Path Write (Path Path, Byte [] byte, OpenOption ... Opsi)
Statis Path Write (jalur path, iterable <? Extends Charsequence> Lines, OpenOption ... Opsi)
Berikut adalah metode yang digunakan di bawah ini. Untuk metode lainnya, silakan lihat dokumentasi API ...
Di antara mereka, OpenOption adalah antarmuka NIO, StandardopenOption adalah kelas implementasi enumerasi. Silakan periksa dokumentasi API untuk setiap fungsi instance enumerasi.
/* Metode sederhana yang disediakan oleh file cocok untuk memproses file teks panjang menengah. Jika file yang akan diproses besar atau biner, maka Anda masih harus menggunakan stream IO klasik*/// baca semua konten file ke dalam byte array byte [] bytes = file.readallbytes (path); // Masukkan ke dalam objek path // Setelah itu, Anda dapat membuat string sesuai dengan karakter set string content = string baru (byte, charset); // Anda juga dapat membacanya secara langsung sebagai urutan baris ke dalam daftar <string> lines = file.readAlllines (path, charset); // pada yang bertentangan, Anda juga dapat menulis string ke dalam file, yang menjadi override. // jeda byte [] // tambahkan konten, tentukan fungsi append seperti add berdasarkan parameter file.write (path, content.getbytes (charset), standardopenoption.append); // Jeda objek enumerasi dan nyalakan sakelar append // tulis daftar koleksi string baris ke file file.write (path, line);
2. Salin, potong, hapus
Metode Signature:
Salin jalur statis (sumber jalur, target jalur, copyoption ... opsi)
Pindah jalur statis (sumber jalur, target jalur, copyoption ... opsi)
statis void delete (jalur jalur) // Jika jalur tidak ada, pengecualian akan dilemparkan. Lebih baik menelepon yang berikut ini saat ini
Static Boolean Deleteifexistists (Path Path)
Berikut adalah metode yang digunakan di bawah ini. Untuk metode lainnya, silakan lihat dokumentasi API ...
Di antara mereka, CopyOption adalah antarmuka NIO, StandardCopyOption adalah kelas implementasi enumerasi. Silakan periksa dokumentasi API untuk setiap fungsi instance enumerasi.
Ada atomic_move yang dapat diisi untuk memastikan operasi atom, baik gerakan ini berhasil diselesaikan, atau file sumber disimpan dalam posisi semula.
// Salin file.copy (Frompath, Topath); // potong file. Jika Anda ingin menimpa, Anda harus lulus dalam parameter Replace_existing. Salin juga atribut file, lulus dalam copy_attributes*/file.copy (frompath, topath, standardcopyoption.replace_existing, standardcopyoption.copy_attributes);
3. Buat file dan direktori
// Buat direktori baru, kecuali untuk komponen terakhir, yang lain harus adalah file yang ada. Createdirectory (path); // Buat direktori perantara di jalur, yang dapat membuat file komponen menengah yang tidak ada. Createdirectories (path);/* Buat file kosong untuk memeriksa keberadaan file. Jika sudah ada, pengecualian akan dilemparkan untuk memeriksa keberadaan file. Oleh karena itu, operasi pembuatan file tidak dapat dilakukan dalam proses*/file.createFile (path); // Tambahkan pre-/akhiran untuk membuat file sementara atau jalur direktori sementara newPath = file.createTempFile (dir, prefix, prefix); path newPath = file.createTempDirectory (dir, prefix);
4. Dapatkan informasi file
Dihilangkan, lihat dokumentasi API untuk detailnya, atau CoreJava Page51
5. Iterasi file di direktori
Kelas file lama memiliki dua metode untuk mendapatkan array string yang terdiri dari semua file dalam direktori, string [] daftar () dan daftar string [] (filter filefilter), tetapi ketika direktori berisi sejumlah besar file, kinerja kedua metode ini akan sangat rendah.
Penyebab Analisis:
1. // Daftar kelas file Semua file string publik [] daftar () {SecurityManager Security = System.GetSecurityManager (); // izin sistem file dapatkan if (keamanan! = Null) {security.checkread (path); } if (isInvalid ()) {return null; } return fs.list (ini); // Panggilan yang mendasari ke daftar sistem file} // Daftar kelas abstrak sistem file // izin sistem file menentukan if (keamanan! = Null) {security.checkread (path); } if (isInvalid ()) {return null; } return fs.list (ini); // Panggilan yang mendasari ke daftar sistem file} // Daftar Kelas Abstrak Sistem File // Kelas File mendefinisikan FS adalah sistem file final statis pribadi yang dihasilkan secara statis oleh DefaultFileSystem fs = DefaultFilesystem.getFilesySyStem (); DefaultFileSystem { /*** Mengembalikan objek sistem file untuk platform Windows. */ public static filesystem getFileSySyStem () {return winntfileSystem baru (); }} // Kelas WinntFileSystem mewarisi dari kelas abstrak sistem file. Di sini kami terutama mengamati metode daftar (file file) @Overridepublic Native String [] Daftar (file f);/*Kita dapat melihat bahwa ini adalah metode asli, yang menunjukkan bahwa operasi daftar dikendalikan oleh sistem file sistem operasi. Ketika direktori berisi sejumlah besar file, kinerja metode ini akan sangat rendah. Oleh karena itu, untuk menggantinya, kelas file NIO yang dirancang newDirectoryStream (path dir) dan metode yang kelebihan bebannya, yang akan menghasilkan objek iterable (dapat diulang oleh foreach) */// ~ 2. // Memanggil kembali filter public string [] Daftar (FileMeFilter Filter) {// menggunakan nama string callback antarmuka [] = () ();; // Daftar Panggilan Semua if ((nama == null) || (filter == null)) {return names; } Daftar <string> v = ArrayList baru <> (); untuk (int i = 0; i <name.length; i ++) {if (filter.accept (this, name [i])) {// callback Metode penerimaan dari filenamefileter objek v.add (nama [i]); }} return v.toArray (string baru [v.size ()]); }Pada saat ini, teknologi tinggi datang - File memperoleh aliran direktori yang dapat diulang,
Lewati di jalur direktori, lintasi direktori keturunan dan kembalikan aliran jalur direktori. Perhatikan bahwa semua jalur yang terlibat di sini adalah direktori daripada file!
Oleh karena itu, kelas file mendesain newDirectoryStream (path dir) dan metode kelebihan bebannya, yang akan menghasilkan objek yang dapat diulang (dapat digunakan untuk reaching iterate)
Iterasi melalui direktori untuk mendapatkan koleksi file keturunan yang dapat diulang
staticDirectoryStream<Path> | newDirectoryStream(Path dir) Membuka Direktori, Mengembalikan DirectoryStream untuk mengulangi semua entri di direktori. |
staticDirectoryStream<Path> | newDirectoryStream(Path dir, DirectoryStream.Filter<? super Path> filter) Membuka Direktori, Mengembalikan DirectoryStream untuk mengulangi entri di direktori. |
staticDirectoryStream<Path> | newDirectoryStream(Path dir, String glob) |
Mengembalikan aliran direktori dapat dianggap sebagai koleksi yang menyimpan semua jalur yang mengimplementasikannya.
Oleh karena itu, iterator atau foreach iterates, tetapi saat menggunakan iterator, berhati -hatilah untuk tidak memohon iterator lain:
Sementara DirectoryStream meluas ke Iterable, itu bukan tujuan umum yang dapat didukung hanya satu iterator tunggal; Meminta metode iterator untuk mendapatkan iterator kedua atau selanjutnya melempar IllegalStateException.
Contoh:
Coba (DirectoryStream <Path> Entries = file.newDirectoryStream (dir)) {for (entri path: entri) {...}}Anda dapat melewati parameter Glob, yaitu, menggunakan mode Glob untuk memfilter file (bukan daftar (filter filefilter)):
newDirectoryStream (path dir, string glob) Perhatikan bahwa itu adalah tipe string
Coba (DirectoryStream <THATE> entri = file.newDirectoryStream (dir, "*.java")) // {...}Mode Glob
Pola Glob yang disebut mengacu pada ekspresi reguler yang disederhanakan yang digunakan oleh shell.
1. Asterisk* cocok dengan 0 atau lebih karakter dalam komponen jalur; Misalnya *.java cocok dengan semua file java di direktori saat ini
2. Dua tanda bintang ** Cocokkan 0 atau lebih karakter melintasi batas direktori; Misalnya, **. Java cocok dengan file java di semua subdirektori
3. Tanda tanya (?) Hanya cocok dengan satu karakter; Misalnya, ????. Java cocok dengan keempat karakter file Java, tidak termasuk ekstensi; menggunakan ? Karena * adalah karakter wildcard dan tidak menentukan nomornya
4. [...] Untuk mencocokkan set karakter, Anda dapat menggunakan koneksi [0-9] dan karakter terbalik [! 0-9]; Sebagai contoh, uji [0-9A-F] .java untuk mencocokkan testx.java, dengan asumsi x adalah angka heksadesimal, [0-9A-F] adalah untuk mencocokkan satu karakter sebagai angka heksadesimal, seperti B (heksadesimal adalah case-tidak sensitif))
Jika Anda menggunakan Dash in Square Brackets untuk memisahkan dua karakter, itu berarti bahwa semua yang ada dalam kisaran kedua karakter ini dapat dicocokkan (misalnya, [0-9] berarti mencocokkan semua angka 0 hingga 9).
5. {...} Cocokkan salah satu dari beberapa opsi opsional yang dipisahkan oleh koma; Misalnya *. {Java, kelas} Cocokkan semua file java dan file kelas
6./ Escape karakter dalam salah satu pola di atas; Misalnya */** cocok dengan file dengan nama file di semua subdirektori dengan *, berikut adalah ** Escape, didahului dengan mencocokkan 0 atau lebih karakter
Berikut ini adalah model glob yang dirangkum oleh netizens:
| Mode Glob | menggambarkan |
|---|---|
| *.txt | Cocokkan semua file dengan ekstensi .txt |
| *. {html, htm} | Cocokkan semua file dengan ekstensi .html atau .htm. {} digunakan untuk mode grup, yang dipisahkan oleh koma |
| ? .txt | Cocokkan karakter tunggal sebagai nama file dan ekstensi .txt |
| . | Cocokkan semua file dengan ekstensi |
| C:/pengguna/* | Cocokkan semua file di direktori pengguna drive C. Backslash "/" digunakan untuk melarikan diri dari karakter yang segera mengikuti |
| /rumah/** | Cocokkan semua /rumah direktori dan file di bawah subdirektori pada platform UNIX. ** Digunakan untuk mencocokkan direktori saat ini dan semua subdirektorinya |
| [xyz] .txt | Cocokkan semua karakter tunggal sebagai nama file, dan satu karakter hanya berisi satu "X" atau "y" atau "z", dan memiliki ekstensi .txt. Kurung persegi [] digunakan untuk menentukan koleksi |
| [AC] .txt | Cocokkan semua karakter tunggal sebagai nama file, dan satu karakter hanya berisi satu dari tiga jenis "A" atau "B" atau "C", dan memiliki ekstensi .txt. Tanda minus "-" digunakan untuk menentukan rentang dan hanya dapat digunakan dalam tanda kurung persegi [] |
| [! a] .txt | Cocokkan semua karakter tunggal sebagai nama file, dan satu karakter tidak dapat berisi huruf "A" dan ekstensi adalah .txt. Tanda seru "!" digunakan untuk meniadakan |
Bukankah baik untuk mengulangi semua koleksi file keturunan di direktori tertentu? Ayo, mari langsung melintasi semua keturunan (termasuk direktori dan file) dari direktori.
Kami dapat memanggil metode Walkfiletree dari kelas file dan meneruskan objek tipe antarmuka Filevisitor (ada lebih banyak metode yang menunggu untuk Anda temukan di API ...)
/*Lulus objek anonim dari subkelas file*/file.walkfileTree (dir, SimpleFilevisitor baru baru <path> () {// walkfileTree callback Metode ini digunakan untuk melintasi semua keturunan yang dikunjungi (path path, dasar fileattribute) untuk kode bisnis, yang tidak ada hubungannya dengan tujuan walkfileetree (melintasi semua anggota keturunan) System.out.println (Path);Mari kita ringkasnya,
File.NewDirectoryStream (Path Dir) Mengembalikan koleksi file keturunan yang dapat diulang setelah traversal;
File.WalkFiletree (Path Dir, Filevisitor FV) adalah proses melintasi direktori dan file keturunan;
Sistem File Zip
Seperti yang kita ketahui di atas, kelas Paths akan mencari jalur di sistem file default, yaitu file pada disk lokal pengguna.
Bahkan, kami juga dapat memiliki sistem file lain, seperti sistem file zip.
/*Misalkan zipName adalah nama file zip*/fileSystem fs = filesystems.newfileSystem (paths.get (zipname), null);
Kode di atas akan membuat sistem file berbasis zipName yang berisi semua file dalam dokumen ZIP.
1) Jika Anda tahu nama file (tipe string), mudah untuk menyalin file dari dokumen zip ini:
File.copy (fs.getpath (nama file), targetPath);
T: fs.getpath menggunakan sistem file zip untuk mendapatkanpath, jadi dapatkah sistem file default dipanggil?
A: Ya. Ada metode statis getDefault () di kelas file file, yang mengembalikan objek sistem file default, yang juga dapat diperoleh dengan nama file getpath.
Untuk tujuan tertentu, apakah getPath (nama string) dilalui atau akses acak, buka untuk melihat implementasi kode sumber saat Anda punya waktu.
2) Untuk mendaftarkan semua file dalam dokumen ZIP, Anda juga dapat menggunakan Walkfiletree untuk melintasi pohon file
FileSystem fs = FileSystems.newFileSystem(Paths.get(fileName), null);//walkFileTree needs to pass in a directory Path to be traversed, and a FileVisitor object Files.walkFileTree(fs.getPath("/"), newSimpleFileVisitor<Path>(){ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) melempar Exception {System.out.println (file);Contoh antarmuka jalur java nio di atas dan kelas file yang bekerja bersama adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.