Artikel ini menganalisis perbedaan antara aliran karakter dan aliran byte di Java untuk referensi Anda. Konten spesifiknya adalah sebagai berikut
1. Apa itu aliran
Aliran di Java adalah abstraksi dari urutan byte. Kita bisa membayangkan ada pipa air, tetapi sekarang tidak lagi air yang mengalir di pipa air, tetapi urutan byte. Seperti aliran air, aliran di Jawa juga memiliki "arah aliran". Objek dari mana urutan byte dapat dibaca disebut aliran input; Objek yang menjadi urutan byte ditulis disebut aliran output.
2. Byte Stream
Unit paling dasar dari pemrosesan aliran byte di Java adalah byte tunggal, yang biasanya digunakan untuk memproses data biner. Dua kelas aliran byte paling dasar di Java adalah InputStream dan OutputStream, yang masing -masing mewakili grup aliran byte input dasar dan aliran byte output. Baik kelas InputStream dan kelas OutputStream adalah kelas abstrak. Dalam penggunaan aktual, kami biasanya menggunakan serangkaian subclass yang disediakan di perpustakaan kelas Java. Mari kita ambil kelas InputStream sebagai contoh untuk memperkenalkan aliran byte di Java.
Kelas InputStream mendefinisikan metode dasar yang dibaca untuk membaca byte dari aliran byte. Definisi metode ini adalah sebagai berikut:
Publik abstrak int read () melempar ioException;
Ini adalah metode abstrak, yaitu, setiap kelas aliran byte input yang diperoleh dari InputStream perlu mengimplementasikan metode ini. Fungsi metode ini adalah membaca byte dari aliran byte, dan mengembalikan -1 jika mencapai akhir, jika tidak mengembalikan byte baca. Apa yang perlu kita perhatikan tentang metode ini adalah bahwa itu akan terus memblokir dan mengembalikan byte baca atau -1. Selain itu, aliran byte tidak mendukung caching secara default, yang berarti bahwa setiap kali metode yang dibaca dipanggil, sistem operasi akan meminta sistem operasi untuk membaca satu byte, yang sering disertai dengan disk IO, sehingga relatif tidak efisien. Beberapa teman mungkin berpikir bahwa metode baca yang kelebihan beban di kelas InputStream dengan array byte karena parameter dapat membaca beberapa byte sekaligus tanpa sering disk IO. Jadi apakah ini masalahnya? Mari kita lihat kode sumber dari metode ini:
Public int read (byte b []) melempar ioException {return read (b, 0, b.length);}Ini memanggil versi lain dari metode overload baca, jadi kami akan terus mengikuti:
Public int read (byte b [], int off, int len) melempar ioException {if (b == null) {lempar nullPointerException baru (); } else if (off <0 || len <0 || len> b.length - off) {throw new indexOutofboundsException (); } else if (len == 0) {return 0; } int c = baca (); if (c == -1) {return -1; } b [off] = (byte) c; int i = 1; coba {untuk (; i <len; i ++) {c = baca (); if (c == -1) {break; } b [OFF + I] = (byte) c; }} catch (ioException ee) {} return i; }Dari kode di atas, kita dapat melihat bahwa pada kenyataannya, metode baca (byte []) juga menggunakan loop untuk memanggil metode baca () untuk membaca ke dalam array byte "pada satu waktu", jadi pada dasarnya metode ini tidak menggunakan buffer memori. Untuk menggunakan buffer memori untuk meningkatkan efisiensi baca, kita harus menggunakan bufferedInputStream.
3. Aliran Karakter
Unit paling dasar dari pemrosesan aliran karakter di Java adalah simbol Unicode (ukuran 2 byte), yang biasanya digunakan untuk memproses data teks. Simbol Unicode yang disebut adalah unit kode unicode dengan kisaran 0x0000 ~ 0xffff. Setiap angka dalam kisaran di atas sesuai dengan karakter. Jenis string di Java mengkodekan karakter dalam aturan unicode secara default dan kemudian menyimpannya dalam memori. Namun, tidak seperti disimpan dalam memori, data yang disimpan pada disk biasanya memiliki berbagai metode pengkodean. Menggunakan metode pengkodean yang berbeda, karakter yang sama akan memiliki representasi biner yang berbeda. Sebenarnya, aliran karakter berfungsi seperti ini:
Output Character Stream: Konversi urutan karakter (sebenarnya urutan simbol unicode) ke urutan byte di bawah metode pengkodean yang ditentukan, dan kemudian tuliskan ke file;
Input Character Stream: Decode urutan byte yang akan dibaca ke dalam urutan karakter yang sesuai (sebenarnya urutan simbol unicode) dalam metode pengkodean yang ditentukan sehingga dapat disimpan dalam memori.
Kami menggunakan demo untuk memperdalam pemahaman kami tentang proses ini. Kode sampel adalah sebagai berikut:
impor java.io.filewriter; impor java.io.ioException; kelas publik FileWriterDemo {public static void main (string [] args) {fileWriter filewriter = null; coba {coba {fileWriter = fileWriter baru ("demo.txt"); FileWriter.write ("Demo"); } akhirnya {fileWriter.close (); }} catch (ioException e) {E.PrintStackTrace (); }}}Dalam kode di atas, kami menggunakan FileWriter untuk menulis empat karakter "demo" ke demo.txt. Kami menggunakan editor hexadecimal WinHex untuk melihat konten demo.txt:
Seperti yang dapat dilihat dari gambar di atas, "demo" yang kami tulis dikodekan sebagai "64 65 6d 6f", tetapi kami tidak secara eksplisit menentukan metode pengkodean dalam kode di atas. Bahkan, ketika kami tidak menentukan, metode pengkodean karakter default sistem operasi digunakan untuk menyandikan karakter yang ingin kami tulis.
Karena aliran karakter sebenarnya perlu menyelesaikan konversi urutan simbol unicode ke metode pengkodean yang sesuai sebelum output, itu akan menggunakan buffer memori untuk menyimpan urutan byte yang dikonversi, dan menunggu konversi diselesaikan sebelum menulis ke file disk bersama -sama.
4. Perbedaan antara aliran karakter dan aliran byte
Setelah deskripsi di atas, kita dapat mengetahui bahwa perbedaan utama antara aliran byte dan aliran karakter tercermin dalam aspek -aspek berikut:
Unit dasar operasi aliran byte adalah byte; Unit dasar operasi aliran karakter adalah simbol unicode.
Secara default, aliran byte tidak menggunakan buffer; Aliran karakter menggunakan buffer.
Aliran byte biasanya digunakan untuk memproses data biner. Bahkan, dapat memproses semua jenis data, tetapi tidak mendukung penulisan atau membaca simbol Unicode secara langsung; Aliran karakter biasanya memproses data teks, yang mendukung penulisan dan membaca simbol Unicode.
Di atas adalah beberapa pemahaman saya tentang aliran karakter dan aliran byte di Java. Jika ada deskripsi yang tidak jelas atau tidak akurat, saya harap Anda dapat memperbaikinya. Terima kasih.