BufferedInputStream
BufferedInputStream adalah aliran input buffered. Ini mewarisi dari filterInputStream.
Tujuan bufferedInputStream adalah untuk menambahkan beberapa fitur ke aliran input lain, seperti menyediakan "fungsi buffering" dan mendukung "Mark () Marks" dan "Reset () Metode Reset".
BufferedInputStream pada dasarnya diimplementasikan melalui array buffer internal. Misalnya, setelah membuat bufferedInputStream yang sesuai dengan aliran input tertentu, ketika kita membaca data aliran input melalui baca (), bufferedInputStream akan mengisi data aliran input ke dalam buffer dalam batch. Setiap kali data dalam buffer dibaca, aliran input akan mengisi buffer data lagi; Ini akan diulangi sampai kami selesai membaca lokasi data aliran input.
Daftar Fungsi BufferedInputStream:
BufferedInputStream(InputStream in)BufferedInputStream(InputStream in, int size)synchronized int available()void close()synchronized void mark(int readlimit)boolean markSupported()synchronized int read()synchronized int read(byte[] buffer, int offset, int byteCount)synchronized void reset()synchronized long skip(long bytecount)
Kode contoh:
Untuk penggunaan API terperinci di bufferedInputStream, lihat kode contoh (bufferedInputStreamTest.java):
impor java.io.bufferedInputStream; impor java.io.bytearrayinputstream; impor java.io.file; impor java.io.inputstream; impor java.io.fileinputStream; impor Java.ioException; impor java.io.filenotfoundan* Program Uji BufferedInputStream * * @author Skywang */kelas publik bufferedInputStreamTest {private static final int len = 5; public static void main (string [] args) {testBufferedInputStream (); } / *** Fungsi uji API dari bufferedInputStream* / private static void testBufferedInputStream () {// Buat stream byte bufferedInputStream, kontennya adalah array arrayleetters coba {file file = file baru ("buferedInputStream.txt"); InputStream in = baru bufferedInputStream (fileInputStream baru (file), 512); // Baca 5 byte dari aliran byte. "ABCDE", A sesuai dengan 0x61, B sesuai dengan 0x62, dan seterusnya ... untuk (int i = 0; i <len; i ++) {// Jika Anda dapat terus membaca byte berikutnya, baca byte berikutnya jika (in.available ()> = 0) { / System.out.printf ("%d: 0x%s/n", i, integer.tohexstring (TMP)); }} // Jika "aliran byte ini" tidak mendukung fungsi penandaan, keluar secara langsung jika (! In.marksupported ()) {System.out.println ("Buat tidak didukung!"); kembali ; } // Tandai "posisi indeks saat ini", yaitu, tandai elemen posisi ke -6 - "f" // 1024 sesuai dengan Marklimit in.mark (1024); // Lewati 22 byte. in.skip (22); // Baca 5 byte byte [] buf = byte baru [len]; in.read (buf, 0, len); // Konversi buf ke string string. String str1 = string baru (buf); System.out.printf ("str1 =%s/n", str1); // Setel ulang "indeks aliran input" ke posisi yang ditandai oleh mark (), yaitu, setel ulang ke "f". in.reset (); // Baca 5 byte ke buf dari "reset byte stream". Yaitu, baca "fghij" in.read (buf, 0, len); // Konversi buf ke string string. String str2 = string baru (buf); System.out.printf ("str2 =%s/n", str2); melampirkan(); } catch (FileNotFoundException e) {e.printstacktrace (); } catch (SecurityException e) {E.PrintStackTrace (); } catch (ioException e) {e.printstacktrace (); }}} Konten BufferedInputStream.txt dibaca dalam program adalah sebagai berikut:
ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSUVWXYZ
Hasil Menjalankan:
0: 0x611: 0x622: 0x633: 0x644: 0x65str1 = 01234str2 = fghij
BufferedOutputStream
BufferedOutputStream adalah aliran output buffered. Ini mewarisi dari filteroutputStream.
Fungsi bufferedOutputStream adalah untuk menyediakan "buffering" ke aliran output lain.
Daftar Fungsi BufferedOutputStream:
BufferedOutputStream (outputStream out) bufferedOutputStream (outputStream out, ukuran int) void close yang disinkronkan () void flush yang disinkronkan () Sinkronisasi void write (byte [] buffer, int offset, int int) Sinkronisasi void write (int oneebyte)
Kode contoh:
Untuk penggunaan API terperinci di bufferedOutputStream, lihat kode contoh (bufferedoutputStreamTest.java):
impor java.io.bufferedoutputStream; impor java.io.file; impor java.io.outputStream; impor java.io.fileoutputstream; Java.io.ioException; impor Java.io.filenotfoundException; impor java.Lang.security exception; Program * * @Author Skywang */kelas publik bufferedOutputStreamTest {private static final int len = 5; // sesuai dengan huruf bahasa Inggris "abcddefghijklmnopqrssttuvwxyz" byte final privat [] arrayletters = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x65, 0x66, 0x67, 0x68, 0x69, 0x65, 0x66, 0x67, 0x68, 0x69, 0x65, 0x66, 0x67, 0x68, 0x69, 0x69 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a}; public static void main (string [] args) {testBufferedOutputStream (); } / *** Fungsi uji API dari bufferedOutputStream* / private static void testBufferedOutputStream () {// Buat bufferedOutputStream yang sesuai dengan "aliran output file" // Ukuran buffer yang sesuai adalah 16, yaitu, ketika data buffer> = 16, konten buffer akan ditulis secara otomatis ke output. coba {file file = file baru ("out.txt"); OutputStream out = baru bufferedOutputStream (fileoutputStream baru (file), 16); // Tulis 10 byte pertama dari array arrayletters ke aliran output out.write (arrayletters, 0, 10); // tulis "newline/n" ke aliran output out.write ('/n'); // todo! // out.flush (); readUserInput (); out.close (); } catch (FileNotFoundException e) {e.printstacktrace (); } catch (SecurityException e) {E.PrintStackTrace (); } catch (ioException e) {e.printstacktrace (); }} / *** Baca input pengguna* / private static void readUserInput () {System.out.println ("Harap masukkan teks:"); Pembaca Pemindai = Pemindai Baru (System.in); // tunggu string input str = reader.next (); System.out.printf ("Inputnya adalah: %s/n", str); }} Hasil Menjalankan:
Hasilkan file "out.txt", dan konten file adalah "abcdefghij".
Pengujian Langkah-demi-Langkah: Ikuti tiga langkah berikut untuk menguji program untuk melihat ukuran buffer dan peran flush ().
Tipe 1: Program Asli
(1) Jalankan program. Ketika program sedang menunggu input pengguna, periksa konten teks "out.txt"; Temukan: Kontennya kosong.
(2) Jalankan program. Setelah input pengguna, periksa konten teks "out.txt"; Temukan: Kontennya adalah "ABCDEFGHIJ".
Dari ini, kami menemukan bahwa hasil (01) dan (02) berbeda; Alasan mengapa konten out.txt di (01) kosong adalah karena ukuran buffer yang sesuai dengan out.txt adalah 16 byte, dan kami hanya menulis 11 byte, sehingga tidak melakukan operasi buffer yang jelas (mis., Tulis data buffer ke aliran output).
Konten yang sesuai dengan out.txt adalah "abcdefghij", karena out.close () dieksekusi, yang menutup aliran output; Sebelum menutup aliran output, data buffer akan ditulis ke aliran output.
Catatan: Saat menguji ulang, hapus pertama out.txt.
Tipe 2: Tambahkan pernyataan berikut sebelum readUserInput ()
out.flush ();
Tujuan dari kalimat ini adalah untuk menulis "konten buffer" ke dalam aliran output.
(1) Jalankan program. Ketika program sedang menunggu input pengguna, periksa konten teks "out.txt"; Temukan: Kontennya adalah "ABCDEFGHIJ".
(2) Jalankan program. Setelah input pengguna, periksa konten teks "out.txt"; Temukan: Kontennya adalah "ABCDEFGHIJ".
Dari ini, kami menemukan bahwa hasil yang sama dengan (01) dan (02), konten out.txt yang sesuai adalah "abcdefghij". Ini karena operasi flush () dilakukan, yang digunakan untuk menulis data buffer ke aliran output.
Catatan: Saat menguji ulang, hapus out.txt dulu!
Tipe 3: Berdasarkan tipe pertama,
out.write (arrayletters, 0, 10);
Dimodifikasi menjadi
out.write (arrayletters, 0, 20);
(1) Jalankan program. Ketika program sedang menunggu input pengguna, periksa konten teks "out.txt"; Temukan bahwa kontennya adalah "ABCDEFGHIJKLMNOPQRST" (tidak termasuk Enter).
(02) Jalankan program. Setelah input pengguna, periksa konten teks "out.txt"; Temukan bahwa kontennya adalah "ABCDEFGHIJKLMNOPQRST" (termasuk Enter).
Dari ini, kami menemukan bahwa (01) hasil dari menjalankan adalah "ABCDEFGHIJKLMNOPQRST" (tidak termasuk pengembalian kereta). Ini karena ukuran buffer adalah 16, dan kami menulis 20 byte melalui out.write (arrayletters, 0, 20), melebihi ukuran buffer; Pada saat ini, semua input akan langsung ditulis ke dalam aliran output tanpa melewati buffer.
(3) Hasil operasi adalah "ABCDEFGHIJKLMNOPQRST" (termasuk pengembalian carriage), karena ketika mengeksekusi.
Catatan: Saat menguji ulang, hapus out.txt dulu!