Fungsi input dan output bahasa Java sangat kuat dan fleksibel. Satu -satunya kelemahan adalah bahwa kode input dan output tampaknya sangat ringkas, karena Anda sering perlu membungkus banyak objek yang berbeda. Di pustaka kelas Java, konten bagian IO sangat besar karena melibatkan berbagai bidang: input dan output standar, operasi file, aliran data pada jaringan, aliran string, aliran objek, aliran file zip ... Tujuan artikel ini adalah untuk memperkenalkan penjelasan terperinci tentang input dan aliran output di Java.
Hierarki aliran
definisi:
Java akan membaca objek data ke dalam aliran input, dan objek yang dapat ditulisnya disebut aliran output. Diagram struktur adalah sebagai berikut:
1. Input dan Output:
Input/output mengacu pada input atau output data ke perangkat atau lingkungan tertentu. Bahasa apa pun memiliki fungsi input dan output. Dalam program Java, input dan output diselesaikan melalui aliran. Ini terhubung ke perangkat fisik melalui sistem input dan output Java. Meskipun perangkat fisik aktual yang terhubung ke aliran input dan output berbeda, mereka dapat bekerja dengan cara yang sama. Misalnya, untuk input dan output hard disk, input dan output dari host jaringan, sehingga akan ada berbagai masalah input dan output dan solusi untuk perangkat atau lingkungan yang berbeda.
2. Stream:
Aliran mengacu pada urutan data yang bergerak antara input dan output komputer. Data dalam urutan aliran dapat berupa data biner mentah yang belum diproses atau data spesifik yang memenuhi persyaratan format tertentu setelah proses pengkodean tertentu. Adalah kebiasaan untuk memanggil bagian yang terkait dengan kode internal dan bagian independen dari kode eksternal.
Dari metode transmisi data, aliran dapat dibagi menjadi aliran input dan aliran output; Dari isi aliran, aliran dapat dibagi menjadi aliran byte dan aliran karakter.
(1) aliran input dan output
Fungsi aliran input adalah membaca data dari bagian dalam program ke luar.
Fungsi aliran output adalah untuk menulis data dari luar program ke dalam.
(2) aliran byte dan aliran karakter
Aliran byte dapat membaca dan menulis data dalam satuan byte, yang dapat membaca dan menulis data dari satu byte satu demi satu, atau membaca dan menulis blok byte dengan panjang apa pun pada suatu waktu (mis., Array byte).
Aliran karakter digunakan dalam karakter saat membaca dan menulis data dalam aliran, satu karakter pada satu waktu, atau satu blok karakter pada satu waktu.
Untuk memfasilitasi pemrosesan aliran, aliran dalam bahasa Java dienkapsulasi dalam paket java.io, jadi untuk menggunakan aliran, Anda harus mengimpor paket java.io.
Stream I/O Java didasarkan pada empat kelas abstrak, yaitu InputStream, OutputStream, pembaca dan penulis. Kelas InputStream dan subkelasnya dapat digunakan untuk mengimplementasikan pemrosesan input data aliran byte; Kelas OutputStream dan subkelasnya dapat digunakan untuk mengimplementasikan pemrosesan output data aliran byte; Kelas pembaca dan subkelasnya dapat digunakan untuk mengimplementasikan pemrosesan input data aliran karakter; Kelas penulis dan subkelasnya dapat digunakan untuk mengimplementasikan pemrosesan output data aliran karakter.
1. Kelas file
Membaca dan menulis file di Java dapat diimplementasikan melalui aliran input dan output, tetapi Java menyediakan kelas file khusus untuk mengimplementasikannya untuk direktori file, properti, dan informasi manajemen.
(1) Konstruktor kelas file
Konstruktor untuk membuat objek kelas file adalah:
File (string pathname); // Buat berdasarkan nama jalur.
File (File Parent, String Child); // Buat di bawah objek file yang diberikan.
File (string induk, string child); // Buat berdasarkan jalur yang ditentukan.
File (url url); // Buat berdasarkan tautan URL.
(2) Metode umum kelas file
Boolean canRead (): Menentukan apakah jalur yang sesuai dengan objek file dapat dibaca.
Boolean CanWrite (): Menentukan apakah jalur yang sesuai dengan objek file dapat ditulis.
Boolean ada (): Menentukan apakah jalur yang sesuai dengan objek file ada.
String getAbsolutePath (): Mendapat jalur absolut dari jalur yang sesuai dari objek file.
String getParent (): Mendapatkan direktori jalur yang sesuai dari objek file.
String getPath (): Mendapat jalur yang sesuai dengan objek file.
boolean isabsolute (): Menentukan apakah jalur yang sesuai dengan objek file adalah jalur absolut.
String getName (): Mendapat nama file dari jalur yang sesuai dari objek file.
boolean isDirectory (): Menentukan apakah jalur yang sesuai dengan objek file adalah direktori.
boolean isFile (): Menentukan apakah jalur yang sesuai dengan objek file adalah file.
boolean ishidden (): Menentukan apakah file yang sesuai dengan objek file adalah atribut tersembunyi.
Panjang panjang (): Dapatkan panjang file yang sesuai dengan objek file.
Long LastModified (): Dapatkan waktu modifikasi terbaru dari file yang sesuai dengan objek file.
Boolean Renameto (File Dest): Ubah nama file file yang sesuai dengan objek file.
boolean setReadOnly (): Atur file yang sesuai dari objek file ke read-only.
(3) Buat file
Buat file baru dengan membuat aliran output file. Metode ini tidak dapat membuat direktori, dan jika file yang ingin Anda buat sudah ada, file baru akan dibuat untuk menimpa file asli.
FileOUTRPutStream File = FileOutputStream baru ("FileName"); (4) Dapatkan daftar file
Dapatkan daftar file folder tertentu melalui metode daftar () atau listFiles () dari kelas file. Ada beberapa bentuk:
String [] list ();
File [] listFiles ();
File [] ListFiles (Filter FileNamefilter);
File [] ListFiles (Filter FileFilter);
Di antara mereka, filefilter dan filenamefilter keduanya antarmuka, dan filter adalah filter yang sesuai. Deklarasikan kelas tertentu dan terapkan antarmuka filter, sehingga semua file yang cocok dapat terdaftar melalui kondisi penyaringan.
2. Kelas InputStream dan Kelas OutputStream
Kelas Byte Stream adalah serangkaian kelas yang berasal dari kelas abstrak InputStream dan OutputStream. Jenis aliran ini didasarkan pada byte. Kelas InputStream dan OutputStream dapat digunakan untuk memproses data file biner, tetapi juga untuk memproses file teks.
1. Metode umum kelas inputstream
Kelas InputStream adalah kelas induk dari semua aliran input. Semua metode kelas ini akan melempar ioException ketika kesalahan terjadi. Metode utamanya adalah:
(1) Publik abstrak int read () IoException tersebut
Metode ini mengembalikan bilangan bulat antara 0 dan 255 atau -1, dan -1 berarti bahwa akhir aliran telah ditemui, dan byte lain yang sesuai dibaca.
(2) Bacaan int publik (byte [] b) IoException tersebut
Metode ini membaca byte ke dalam array byte yang diberikan oleh parameter, dan nilai pengembalian adalah jumlah byte yang sebenarnya dibaca di atau -1 (akhir aliran ditemui).
(3) Baca int publik (byte [] b, int i, int b) IoException itu
Dua parameter terakhir dari metode ini memberikan posisi awal baca dan jumlah maksimum byte masing -masing.
(4) Int publik tersedia ()
Mengembalikan jumlah byte yang belum dibaca di objek aliran saat ini. Yaitu, dapatkan panjang data dalam aliran.
(5) lompatan panjang publik (long n)
Lewati b byte dalam objek aliran saat ini, dan jumlah aktual byte yang dilewati dikembalikan sebagai nilai pengembalian.
(6) Markasported Boolean Publik ()
Tentukan apakah arus mendukung tanda, dan tanda dapat dengan mudah kembali ke posisi baca asli.
(7) public void close ()
Tutup objek aliran saat ini dan lepaskan sumber daya yang ditempati oleh objek Stream.
(8) Mark void publik (int i)
Atur bendera untuk posisi saat ini di aliran sehingga Anda dapat terus membaca dari posisi itu nanti.
(9) reset public void ()
Kembalikan posisi membaca aliran ke posisi tanda yang ditetapkan.
2. Metode Umum Kelas OutputStream
Kelas OutputStream adalah kelas induk dari semua aliran output. Semua metode pengembalian kelas ini batal dan melempar ioException dalam kasus kesalahan. Metode utamanya adalah:
(1) Write public void (int b) melempar ioException
Tulis byte data di akhir aliran.
(2) Write public void (byte [] b) melempar ioException
Tulis data di Array B ke objek aliran saat ini secara bergantian.
(3) kawat public void (byte [] b, int i, int n)
Tulis data dengan panjang selanjutnya dalam array ke dalam objek stream secara berurutan dari awal (termasuk).
(4) public void close ()
Tutup objek aliran saat ini dan lepaskan sumber daya yang ditempati oleh objek Stream.
(5) public void flush ()
Paksa output data buffered di objek aliran saat ini. Gunakan metode ini untuk mencapai output langsung.
Sebagian besar metode dari dua kelas di atas ditimpa oleh subclass inputstream dan outputstream, kecuali untuk metode mark () dan reset ().
3. Kelas FileInputStream
Kelas FileInputStream adalah subclass dari InputStream, yang dapat digunakan untuk memproses aliran data yang menggunakan file sebagai sumber input data untuk mengimplementasikan operasi pembacaan file.
Metode konstruksinya adalah:
(1) FileInputStream (File f)
Buat aliran input file dengan objek file f dengan nama yang ditentukan sebagai sumber data.
Jika F ada, itu harus menjadi jalur file. Jika itu adalah direktori, iOException akan dilemparkan, tetapi jika direktori ini tidak ada, itu akan dilemparkan: FileNotFoundException akan dilemparkan.
(2) FileInputStream (nama string)
Buat aliran input file dengan nama file bernama sebagai sumber data.
(3) FileInputStream (FileDeScriptor f)
Buat aliran input file untuk ujung input berdasarkan objek deskriptor file f.
Metode utamanya adalah mengganti metode kelas induk (kelas inputstream): baca (), baca (byte [] b), baca (byte [] b, int i, panjang int), lewati (long n), tersedia (), tutup ().
4. Kelas FileOutputStream
Kelas FileOutputStream adalah subclass dari OutputStream, yang digunakan untuk memproses aliran data output berdasarkan file sebagai data, dan mengimplementasikan operasi tulis ke file. Metode konstruksinya adalah:
FileOutputStream (file f);
FileOutputStream (file f, boolean b);
FileOutputStream (string f);
Metode utamanya termasuk metode yang mencakup kelas induk: tulis (int b), write (byte [] b), write (byte [] b, int off, int len), close (), dan flush ().
5. Kelas DataInputStream dan DataOutputStream
Objek yang dibuat oleh DateInputStream dan Kelas DataOutputStream masing -masing disebut aliran input data dan aliran output data. Mereka masing -masing mengimplementasikan antarmuka datainput dan antarmuka dataoutput. Kelas DateInputStream dan Objek DataOutputStream memungkinkan pembacaan berbagai jenis data Java.
Kedua aliran ini termasuk dalam aliran penyaringan, dan aliran lain seperti InputStream atau OutputStream sering digunakan sebagai input atau outputnya. Misalnya:
FileInputStream fis = new fileInputStream ("d: //a.txt");
DataInputStream dis = new DatalputStream (FIS);
FileOutputStream fos = baru fileOutputStream ("d: //a.txt");
DataOutputStream dos = DataOutputStream baru (FOS);
Input dan output DateInputStream dan DataOutputStream hampir sesuai. Metode bacaan dan penulisan dari setiap tipe data dasar dapat diidentifikasi dari nama akhirannya. Misalnya:
readInt (), writeint () // baca dan tulis nilai int
readboolean (), writeboolean () // baca dan tulis nilai boolean
readchar (), writechar () // baca dan tulis karakter
readdouble (), writedouble () // baca dan tulis nilai floating point presisi ganda
readfloat (), writeefloat () // baca dan tulis nilai floating-point presisi tunggal
Writechars () // tulis string, tetapi tidak ada cara untuk membaca string secara langsung
3. Kelas Pembaca dan Kelas Penulis
Karakter dalam Java menggunakan pengkodean unicode, masing -masing karakter memiliki dua byte, yaitu, 16 bit. Aliran karakter didasarkan pada karakter yang diwakili oleh kode unicode 16-bit, dan membaca dan menulis data teks, yang dapat mewujudkan konversi antara format internal dalam program Java dan format eksternal seperti file teks, output tampilan, input keyboard, dll. Metode ini sangat cocok untuk pengoperasian karakter Cina. Jika karakter Cina beroperasi dalam byte, dimungkinkan untuk menghasilkan kode yang kacau.
Pembaca dan penulis adalah kelas induk abstrak dari semua aliran karakter dalam paket java.io, mendefinisikan metode utama untuk mengimplementasikan kelas aliran lainnya. Dua yang paling penting adalah baca () dan write (), yang masing -masing membaca dan menulis data karakter. Metode kelas pembaca dan penulis dan subclass mereka sangat mirip dengan metode menggunakan kelas inputstream, kelas outputstream dan subclass mereka. Tetapi parameter di dalamnya diganti dengan karakter atau array karakter.
1. Metode umum kelas pembaca dan kelas penulis
Kelas pembaca adalah kelas abstrak. Semua metode kelas ini akan melempar pengecualian ioException dalam kondisi kesalahan. Metode umum adalah sebagai berikut:
(1) Abstrak void tutup (): Tutup sumber input.
(2) Mark void (int numchars): Tempatkan tanda ke titik saat ini dari sumber input.
(3) Boolean Marksupported (): Jika aliran ini mendukung metode tanda/reset, true akan dikembalikan.
(4) int read (): Baca satu karakter.
(5) int baca (char [] buf): Baca karakter ke dalam array karakter.
(6) Abstrak int read (char [] buf, int offset, int numchars): baca karakter ke bagian array.
(7) Boolean Ready (): Kembalikan true jika permintaan input berikutnya tidak harus menunggu, jika tidak, kembalikan False.
(8) void reset (): Setel ulang pointer input ke set yang ditandai sebelumnya.
(9) Lompat Long (Numchars Long): Lewati N Input Karakter dan Kembalikan Jumlah Karakter Aktual Dilewati.
Kelas penulis juga merupakan kelas abstrak, dan metode yang umum digunakan adalah sebagai berikut:
(1) Abstrak Void Close (): Tutup aliran output.
(2) Abstrak void flush (): Tentukan status output untuk menghapus cache apa pun.
(3) void write (int ch): tulis satu karakter.
(4) void write (char [] buf): tulis ke array karakter.
(5) Abstrak void write (char [] buf, int offset, int numchars): tulis bagian dari array karakter.
(6) void write (string str): tulis string.
(7) void write (string str string, int offset, int numchars): tulis bagian dari string.
2. Kelas Filereader
Kelas Filereader mewarisi dari kelas InputStreamReader, dan kelas InputStreamReader mewarisi dari kelas pembaca. Oleh karena itu, metode yang disediakan oleh kelas pembaca dan kelas InputStreamReader dapat digunakan untuk objek yang dibuat oleh kelas filereader. Metode konstruktor filereader adalah:
Filereader (file file);
Filereader (FileDescriptor e);
Filereader (nama file string);
3. Kelas FileWriter
Kelas FileWrit mewarisi dari kelas OutputStreamWriter, dan kelas OutputStreamWriter mewarisi dari kelas penulis. Oleh karena itu, metode yang disediakan oleh kelas penulis dan kelas OutputStreamWriter dapat digunakan oleh objek yang dibuat oleh kelas FileWriter. Metode konstruktor filewriter adalah:
FileWrite (File FilePath);
FileWrite (file f, boolean append);
FileWrite (FileDescriptor e);
FileWrite (nama file string);
FileWrite (nama file string, boolean append);
4. Kelas BufferedReader
Kelas BufferedReader mewarisi dari kelas pembaca, yang digunakan untuk membaca data dalam buffer. Kelas BufferedReader milik aliran penyaringan, dan aliran lain seperti filereader sering digunakan sebagai input atau outputnya. Metode konstruksinya adalah:
BufferedReader (pembaca dalam);
BufferedReader (pembaca di, int bufsize);
Misalnya:
Filereader fr = filereader baru ("d: /1.txt");
BufferedReader buf = new bufferedReader (FR);
BufferedReader menyediakan metode readerline () untuk membaca setiap baris teks.
5. Kelas BufferedWriter
Kelas BufferedWriter mewarisi dari kelas penulis, dan kelas BufferedWriter digunakan untuk menulis data ke dalam buffer. Menggunakan kelas BufferedWriter mirip dengan menggunakan kelas bufferedReader. Perbedaannya adalah bahwa data dalam buffer harus dibersihkan dengan metode flush () pada akhirnya, yaitu, tulis semua data dalam buffer ke dalam file. Metode konstruksinya adalah:
BufferedWriter (penulis keluar);
BufferedWriter (penulis keluar, int bufsize);
4. Kelas RandomAccessFile
Akses file acak di Java memerlukan penggunaan kelas acakAccessFile (kelas ini memungkinkan akses dari lokasi mana pun, tidak hanya membaca, tetapi juga menulis), yang secara langsung mewarisi dari kelas objek dan mengimplementasikan datainput dan data interfaces.
Karena kelas acak ACCHACCESSFILE mengimplementasikan semua metode yang ditentukan dalam antarmuka DataInput dan DataOutput, dapat membaca data tipe dasar dari file dan menulis data tipe dasar ke file. Selain metode yang didefinisikan dalam antarmuka datainput dan data output, kelas acakAccessFile juga mendefinisikan beberapa metode lain untuk mendukung akses acak.
Aliran yang dibuat oleh kelas acak ACCACESSFILE berbeda dari aliran input dan output sebelumnya. Kelas acakAccessFile bukanlah subkelas dari kelas inputStream di kelas aliran input, atau subkelas dari kelas outputStream di kelas aliran output. Namun, arah aliran yang dibuat oleh kelas acak AccessFile dapat digunakan sebagai sumber dan tujuan. Dengan kata lain, saat membaca dan menulis file, Anda dapat membuat aliran acakeCacSFile yang menunjuk ke file, sehingga Anda dapat membaca data file dari aliran dan menulis data ke file melalui aliran.
Dua Metode Konstruktor Kelas RandomAccessFile:
(1) RandomAccessFile (nama string, mode string)
Nama parameter digunakan untuk menentukan nama file, memberikan sumber (juga tujuan aliran) dari aliran yang dibuat, dan mode parameter mengambil R (read-only) atau RW (baca-writable), yang menentukan hak akses dari aliran yang dibuat ke file.
(2) RandomAccessFile (File File, Mode String)
File parameter adalah objek file, yang memberikan sumber (juga tujuan aliran). Mode parameter mengambil R (read-only) atau RW (baca-writable), dan menentukan hak akses dari aliran yang dibuat ke file. Saat membuat objek, FileNotFoundException harus ditangkap; Ketika aliran melakukan operasi baca dan tulis, IOException harus ditangkap.
Metode membaca dan menulis informasi dari objek acakeCacSFile sama dengan metode input dan mengeluarkan objek data. Itu dapat mengakses semua metode baca () dan tulis () di kelas DataInputStream dan dataOutputStream.
Cara Memindahkan File Baca dan Menulis Pointer:
(1) Long getFilePointer (): Mengembalikan lokasi saat ini dari pointer file.
(2) Void Seek (Long POS): Tempatkan pointer file di posisi absolut yang ditentukan. Nilai posisi dihitung sebagai byte offset POS dari awal file. POS adalah 0, yang mewakili awal file.
(3) panjang panjang (): Mengembalikan panjang file. Nilai posisi adalah panjang (), yang mewakili akhir file.