Kata pengantar
Mulai dari artikel ini, kita akan mulai mempelajari sistem Java IO, yang pada dasarnya adalah membaca dan menulis file. Kedengarannya sederhana, tetapi tidak mudah. Sistem IO Java telah membaik dan meningkat, dan telah merancang sejumlah besar kelas. Hanya dengan memahami makna jenis ini yang dirancang dan skenario aplikasi masing -masing dapat meningkatkan pemahaman file IO.
Jadi, langkah pertama adalah menyelesaikan masalah bagaimana mewakili file. Di dunia Java, "semuanya adalah objek", dan bagaimana cara sesuai dengan file disk atau direktori yang sebenarnya ke objek Java adalah masalah utama kami.
File digunakan di java untuk abstrak file, apakah itu file normal atau direktori, itu dapat sesuai dengan objek file. Saya pikir setiap orang harus akurat dalam memposisikan jenis file: Ini secara abstrak mewakili file atau direktori pada disk, dan sebenarnya bergantung pada kelas sistem file lokal yang tidak tergantung platform, dan file tidak dapat melakukan operasi baca dan tulis pada konten file yang diwakilinya (itulah aliran yang dilakukan).
Bangun contoh file
Sebelum benar -benar memperkenalkan metode konstruktor instance file, kita perlu melihat beberapa anggota atribut penting.
sistem file final statis private fs = defaultFileSystem.getFileSystem ();
Ini adalah anggota inti paling inti dari kelas file, yang direpresentasikan sebagai API sistem file dari sistem saat ini. Semua operasi yang dikeluarkan untuk disk didasarkan pada properti ini.
jalur string final pribadi;
Jalur mewakili nama jalur lengkap dari instance saat ini. Jika instance file saat ini mewakili direktori, maka nilai jalur adalah nama direktori lengkap. Jika mewakili file murni, maka nilai jalur ini sama dengan jalur lengkap file + nama file.
public static final char separatorchar = fs.getSeparator (); public static final char pathseparatorchar = fs.getpathseparator ();
SeparatorChar mewakili pemisah antara direktori, dan Pathseparatorchar mewakili pemisah di bawah jalur yang berbeda. Kedua nilai ini berbeda di bawah platform sistem yang berbeda. Misalnya, nilai -nilai keduanya di bawah jendela adalah: "" dan ";", di mana larangan digunakan untuk memisahkan beberapa jalur yang berbeda.
Kelas file menyediakan empat konstruktor yang berbeda untuk membuat instantiasi objek file, tetapi hanya tiga yang lebih umum digunakan. Kami juga fokus mempelajari tiga konstruktor pertama.
file publik (string pathname)
Ini adalah cara paling umum untuk membuat objek file. Nilai pathname dapat berupa direktori atau nama file biasa. Misalnya:
File file = file baru ("c: // pengguna // Yanga // desktop"); file file1 = file baru ("c: //users//yanga//desktop//a.txt"); file file2 = file baru ("a.txt");Tentu saja, Anda juga dapat secara eksplisit menentukan jalur induk:
File publik (String Parent, String Child)
Di dalam konstruktor, program akan menyambungkan jalur file lengkap untuk kami, misalnya:
File file = file baru ("c: // pengguna // Yanga // desktop", "a.txt"); file file1 = file baru ("c: // pengguna // Yanga // desktop", "java");Konstruktor ketiga pada dasarnya sama dengan yang kedua, kecuali bahwa ia menambahkan proses enkapsulasi dari contoh file induk:
File publik (File Parent, String Child)
Situasi serupa tidak akan dijelaskan. Kami belum mempelajari implementasi spesifik internal dari konstruktor ini di sini. Bukannya itu sederhana. Sebaliknya, file terlalu bergantung pada sistem file lokal dan implementasi banyak metode tidak dapat dilihat secara langsung. Oleh karena itu, untuk pembelajaran file, cukup mahir dalam menguasainya, dan implementasi spesifik tidak dapat dipelajari secara mendalam untuk saat ini.
Dapatkan informasi yang terkait dengan nama file atau jalur
Metode getName dapat digunakan untuk mendapatkan nama file:
Public String getName () {int index = path.LastIndexOf (SeparatorChar); if (index <prefixlength) return path.substring (prefixlength); return path.substring (indeks + 1);}Ingat apa yang diwakili oleh SeparatorChar kami?
Ini direpresentasikan sebagai pemisah path, simbol "" di Windows disimpan di atribut PATH, dan nama jalur lengkap dari instance file saat ini, sehingga semua karakter setelah kejadian terakhir harus menjadi nama file kami.
Tentu saja Anda harus menemukan bahwa untuk file murni, metode ini dapat mengembalikan nama file sederhana, sedangkan untuk direktori, nilai pengembalian akan menjadi nama direktori terbaru. Misalnya:
File file = file baru ("c: //users//yanga//desktop//a.txt"); System.out.println (file.getname ()); file file1 = file baru ("c: // user1.getname // desktop"); System.out.println (file1.getname ());Output tidak akan mengejutkan Anda:
A.txtdesktop
Metode GetParent digunakan untuk mengembalikan direktori induk dari file saat ini. Apakah Anda adalah file biasa atau direktori, Anda pada akhirnya akan memiliki direktori induk Anda (tentu saja, file sementara yang dihasilkan oleh mesin virtual tidak tentu saja).
Public String getParent () {int index = path.LastIndexOf (SeparatorChar); if (index <prefixlength) {if ((prefixlength> 0) && (path.length ()> prefixlength)) return path.substring (0, prefixlength); kembali nol; } return path.substring (0, index);}Implementasi metode ini sangat sederhana, jadi saya tidak akan membahas detailnya.
Metode GetPath dapat mengembalikan nama file lengkap dari instance file saat ini:
Public String getPath () {return path;}Berikut ini adalah beberapa operasi terkait yang terkait dengan direktori, yang relatif mudah diimplementasikan. Berikut adalah daftar singkat:
Di sini kita perlu menjelaskan beberapa penjelasan tentang getcanonicalpath, apa itu jalur standar, dan apakah ada perbedaan antara jalur absolut?
Secara umum, "../" berarti direktori sebelumnya dari direktori di mana file sumber berada, "../" berarti direktori sebelumnya dari direktori tempat file sumber berada, dan sebagainya. Metode GETABSOLUTEPATH tidak melakukan operasi konversi seperti itu, sementara metode GetCanonicalPath mengenali karakter khusus ini dan mengambil semantik yang sesuai.
Misalnya:
File file = file baru ("..// a.txt"); System.out.println (file.getAbsolutePath ()); System.out.println (file.getCanonicalPath ());Hasil output:
C:/Pengguna/Yanga/desktop/java/workspace2017/testfile /../ a.txt
C: /users/yanga/desktop/java/workspace2017/a.txt
Yang pertama akan menggunakan "../a.txt" sebagai bagian dari nama jalur file, sedangkan yang terakhir dapat mengenali bahwa "../a.txt" berarti bahwa "a.txt" terletak di direktori atas direktori saat ini. Ini adalah perbedaan terbesar antara keduanya, cocok untuk situasi yang berbeda.
Dapatkan informasi atribut file
Pengoperasian bagian file ini sebenarnya sangat sederhana, tidak lebih dari beberapa pertanyaan tentang izin file, apakah itu dapat dibaca, apakah itu dapat ditulis, apakah itu file tersembunyi, dll. Mari kita lihat metode ini secara rinci:
Perlu dicatat bahwa metode panjang dapat dengan benar mengembalikan jumlah total byte dari file untuk file murni, tetapi untuk direktori, nilai pengembalian akan menjadi nilai "tidak ditentukan", yang bukan jumlah total byte dari semua file dalam direktori atau nol, tetapi hanya merupakan nilai yang tidak ditentukan, yang tidak memiliki makna.
Operasi file
Pengoperasian file tidak lebih dari "penambahan, penghapusan, modifikasi, dan pencarian". Mari kita lihat bersama.
Tentu saja, ketika berhadapan dengan dua operasi pembuatan dan penghapusan baru yang sederhana di atas, kelas file juga menyediakan apa yang disebut operasi "kueri", yang perlu kita pelajari dengan cermat. Misalnya:
public string [] list () {SecurityManager Security = System.GetSecurityManager (); if (Security! = null) {Security.Checkread (path); } if (isInvalid ()) {return null; } return fs.list (this);}Metode ini akan mengambil semua nama sederhana "file murni" dan "direktori" di direktori yang diwakili oleh instance saat ini. Misalnya:
File file = file baru ("c: // pengguna // Yanga // desktop"); string [] list = file.list (); untuk (string str: list) {System.out.println (str);}Hasil output dari program akan mencetak nama sederhana semua file di direktori desktop komputer saya, jadi saya tidak akan menunjukkannya kepada Anda.
Satu hal yang perlu diperhatikan adalah bahwa jika instance file kami tidak sesuai dengan direktori tetapi file biasa, maka daftar akan mengembalikan null.
Selanjutnya, mari kita lihat metode untuk mengambil file direktori:
PUBLIK STRING [] Daftar (FileNeMeFilter Filter) {string names [] = list (); if ((name == null) || (filter == null)) {return names; } Daftar <string> v = ArrayList baru <> (); untuk (int i = 0; i <name.length; i ++) {if (filter.accept (ini, nama [i])) {v.add (nama [i]); }} return v.toArray (string baru [v.size ()]);}Metode ini sebenarnya adalah versi Daftar yang kelebihan beban, yang memungkinkan Anda untuk memasukkan filter untuk memfilter hanya file dan direktori yang kami butuhkan saat mencari direktori.
Tetapi definisi antarmuka filenamefilter sangat sederhana:
antarmuka publik filenamefilter {boolean accept (file dir, nama string);}Anda hanya perlu mengganti metode penerimaan ini. Setiap kali daftar untuk Loop memperoleh file atau direktori, ia akan mencoba memanggil metode penyaringan ini terlebih dahulu. Jika Anda melewati penyaringan, nama sederhana dari file saat ini akan ditambahkan ke koleksi pengembalian.
Oleh karena itu, penulisan ulang metode penerimaan ini menentukan file mana yang dapat melewati penyaringan dan mana yang tidak dapat. Mari kita lihat contoh:
File di folder tes di desktop saya adalah sebagai berikut:
File file = file baru ("c: // pengguna // Yanga // desktop // test"); String [] list = file.list (filenamefilter baru () {@Override public boolean accept (file dir, nama string) {// objek file saat ini diwakili oleh dir // name adalah nama sederhana dari item file yang saat ini dilintasi jika (! Name.endswith (". untuk (string str: list) {System.out.println (str); }Di sini, kami menggunakan kelas dalam anonim untuk membuat instance subkelas filenamefilter, dan kemudian mengimplementasikan metode penerimaannya. Implementasi spesifik sangat sederhana, menyaring semua direktori dan mengeluarkan nama -nama sederhana dari semua file biasa.
Hasil output akhir adalah sebagai berikut:
3.txt
4.txt
Tentu saja, ada juga dua metode daftar "bermutasi" di kelas file, seperti:
Mereka tidak lagi mengembalikan nama sederhana "file murni" dan "direktori" di direktori target, tetapi mengembalikan objek file yang sesuai. Bahkan, itu bukan apa -apa. Direktori target + nama sederhana dapat membangun instance file ini.
Oleh karena itu, pada dasarnya, metode daftar tidak akan melintasi semua file di direktori target, yaitu file dalam subdirektori direktori target tidak akan diakses dan dilalui.
Jadi, Anda harus berpikir tentang cara melintasi semua file di direktori target, termasuk file dalam di subdirektori tingkat pertama. Jawabannya akan diberikan di akhir artikel.
Dua metode berikutnya terkait dengan pembuatan folder:
Keduanya didasarkan pada instance file saat ini untuk membuat folder. Mengenai perbedaan mereka, mari kita lihat sepotong kode:
File file = new File("C://Users//yanga//Desktop//test2");System.out.println(file.mkdir());File file2 = new File("C://Users//yanga//Desktop//test3//hello");System.out.println(file2.mkdir());Di antara mereka, Test2 dan Test3 tidak ada sampai program dieksekusi.
Hasil output adalah sebagai berikut:
BENAR
PALSU
Mengapa yang terakhir gagal membuat?
Hal ini disebabkan oleh fakta bahwa metode MKDIR hanya dapat membuat satu folder pada satu waktu, yang akan menyebabkan kegagalan pembuatan jika induk atau direktori yang lebih tinggi dari direktori yang diberikan ada direktori yang tidak diciptakan.
Metode MKDIRS digunakan untuk menyelesaikan situasi ini. Ini akan membuat semua direktori yang tidak diciptakan pada jalur target, lihat kode:
File file3 = file baru ("c: // pengguna // Yanga // desktop // test3 // hello // 231"); System.out.println (file3.mkdirs ());Bahkan jika folder Test3 kami tidak ada, setelah program berjalan, tiga folder test3, halo, dan 231 akan dibuat.
Selain itu, File juga memiliki metode untuk membuat file sementara. File sementara yang disebut adalah: mereka ada selama runtime dan dihancurkan ketika mesin virtual ditutup. Anda dapat mempelajarinya sendiri. Ini relatif mudah digunakan, jadi saya tidak akan membahas detailnya di sini.
Pada titik ini, kami secara kasar belajar tentang file jenis file. Saya percaya semua orang akan lebih atau kurang merasa bahwa desain mewakili file dan direktori murni menggunakan jenis yang sama tampaknya agak membingungkan dan tidak masuk akal. Saya tahu bahwa JDK1.7 Sun telah meluncurkan file dan jalur ke file dan direktori yang terpisah, dan kami akan belajar lebih banyak tentang hal itu di artikel mendatang.
Semua kode, gambar, dan file dalam artikel disimpan di cloud di github saya:
(https://github.com/singleyam/overview_java)
Anda juga dapat memilih untuk mengunduh secara lokal.
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.