Konsep “stream” berasal dari konsep pipa di UNIX. Di UNIX, pipa adalah aliran byte tak terputus yang digunakan untuk mengimplementasikan komunikasi antar program atau proses, atau untuk membaca dan menulis perangkat periferal, file eksternal, dll. Pipa ini melindungi detail pemrosesan data di perangkat I/O sebenarnya. Aliran harus memiliki sumber dan tujuan, yang dapat berupa area tertentu di memori komputer, file disk, atau bahkan URL di Internet. Arah aliran itu penting. Berdasarkan arah alirannya, aliran dapat dibagi menjadi dua kategori: aliran masukan dan aliran keluaran. Faktanya, input/output adalah untuk memori. Faktanya, sumber dan tujuan aliran dapat secara sederhana dianggap sebagai penghasil dan konsumen byte. Untuk aliran input, Anda tidak perlu peduli dengan sumbernya, selama Anda cukup membaca data dari aliran tersebut, dan untuk aliran masukan Aliran keluaran juga tidak mengetahui tujuannya dan hanya menulis data ke aliran tersebut.
a.Stream : Sekumpulan urutan data yang terurut.
b Aliran byte: Unit data terkecil dalam aliran data adalah byte.
c. Aliran karakter: Unit data terkecil dalam aliran data adalah karakter.
1. Kelas-kelas dalam paket java.io berhubungan dengan dua jenis aliran
Salah satu jenis aliran membaca atau menulis langsung dari lokasi tertentu (seperti file disk atau area memori). Jenis aliran ini disebut aliran node, dan aliran lainnya disebut aliran filter (aliran pengemasan).
Memfilter aliran: Beberapa aliran dapat menerima byte dari file dan tempat lain, dan aliran lainnya dapat menggabungkan byte menjadi tipe data yang lebih berguna. Konstruktor yang meneruskan aliran yang ada ke aliran lain dan menggabungkan kedua aliran tersebut disebut aliran terfilter. Aliran masukan filter sering kali menggunakan aliran masukan lain sebagai sumber masukannya. Setelah disaring atau diproses, aliran tersebut diberikan kepada pengguna dalam bentuk aliran masukan baru. Kami jarang menggunakan satu kelas untuk membuat objek aliran, melainkan menyediakan fungsionalitas yang diinginkan dengan melapisi beberapa objek (yaitu pola desain dekorator).
Aliran input dan output yang umum digunakan di Java sebenarnya diwarisi dari empat kelas abstrak, yaitu:
Berdasarkan InputStream byte tunggal, kelas OutputStream (I/O berorientasi byte)
Kelas Pembaca dan Penulis berdasarkan unit kode Unicode byte ganda (I/O berorientasi karakter)
Setelah aliran masukan dibuka, program dapat membaca data secara serial dari aliran masukan. Proses pembacaan/penulisan data dari aliran masukan secara umum adalah sebagai berikut: buka saluran aliran --> baca/tulis informasi --> tutup saluran aliran.
Di platform Java, ada dua cara untuk mendapatkan tipe pengkodean karakter platform lokal:
(a) System.getProperty("file.encoding");
(b) Charset cs=Charset.defaultCharset();
Semua aliran input dan aliran output dapat dibagi menjadi aliran byte (input, output) dan aliran karakter (input, output). Aliran yang memproses byte sebagian besar adalah seri (OutputStream/InputStream), dan aliran yang memproses karakter sebagian besar (Pembaca/Tulis). ) seri
2. Aliran input berorientasi byte (seri InputStream), kelas-kelas ini dapat dihubungkan ke objek FileInputStream untuk menyediakan antarmuka yang berguna:
ByteArrayInputStream: Gunakan buffer di memori sebagai InputStream
StringBufferInputStream (tidak digunakan lagi di java1.1): Gunakan objek String sebagai InputStream, dan implementasi yang mendasarinya menggunakan StringBuffer
FileInputStream: Gunakan file sebagai InputStream untuk mengimplementasikan operasi pembacaan file (nama file, file, objek FileDescriptor)
PipedInputStream: mengimplementasikan konsep pipa, terutama digunakan di thread (sebagai sumber data dalam berbagai proses)
SequenceInputStream: Gabungkan beberapa InputStream menjadi satu InputStream
Aliran keluaran berorientasi byte (seri OutputStream) dapat dihubungkan ke objek FilterOutputStream untuk menyediakan antarmuka yang berguna:
ByteArrayOutputStream: Membuat buffer di memori, menyimpan informasi dalam buffer di memori, dan menginisialisasi ukuran buffer (opsional)
FileOutputStream: Menyimpan informasi dalam file (nama file, file, FileDescriptor)
PipedOutputStream: mengimplementasikan konsep pipa, terutama digunakan di thread (menentukan tujuan data untuk multi-thread)
3. Seri (Pembaca/Penulis) yang sesuai :
Pembaca: Sesuai dengan InputStream, adaptor InputStreamReader
Penulis: sesuai dengan OutputStream, dan adaptornya adalah OutputStreamWriter
FileReader: Sesuai dengan FileOutputStream
FileWriter: sesuai dengan FileOurputStream
StringReader: Tidak ada kelas yang sesuai
StringWriter: Sesuai dengan ByteArrayInputStream
CharArrayReader: Sesuai dengan ByteArrayOutputStream
CharArrayWriter: Sesuai dengan ByteArrayOutputStream
PipedReader: Sesuai dengan PipedInputStream
PipedWriter: Sesuai dengan PipedOutputStream
4. Konversi antara dua aliran tidak dibatasi ( menggunakan kelas adaptor)
InputStreamReader dan OutputStreamReader: Mengubah aliran berorientasi byte menjadi aliran berorientasi karakter.
InputStreamReader adalah jembatan dari aliran byte ke aliran karakter: ia membaca byte menggunakan rangkaian karakter tertentu dan menerjemahkannya menjadi karakter. Kumpulan karakter yang digunakannya dapat ditentukan berdasarkan nama atau diberikan secara eksplisit, atau dapat menerima kumpulan karakter default platform.
OutputStreamWriter adalah jembatan dari aliran karakter ke aliran byte: karakter yang akan ditulis ke aliran dapat dikodekan menjadi byte menggunakan rangkaian karakter yang ditentukan. Kumpulan karakter yang digunakannya dapat ditentukan berdasarkan nama atau diberikan secara eksplisit, jika tidak, kumpulan karakter default platform akan diterima
5. Membaca data dari InputStream melalui FilterInputStream :
DataInputStream: Membaca data tipe dasar (int, char, long, dll.) dari aliran.
BufferedInputStream: Gunakan buffer untuk mencegah keharusan melakukan operasi baca aktual setiap saat
LineNumberInputStream: akan mencatat jumlah baris dalam aliran input, lalu memanggil getLineNumber() dan setLineNumber(int)
PushbackInputStream: Jarang digunakan, umumnya digunakan untuk pengembangan kompiler
Menulis ke OutputStream melalui FilterOutputStream:
DataIOutputStream: Data tipe dasar (int, char, long, dll.) dapat dikeluarkan ke aliran sesuai dengan metode transplantasi.
BufferedOutputStream: Gunakan buffer untuk menghindari penulisan sebenarnya setiap kali Anda mengirim data
PrintStream: menghasilkan output yang diformat, dimana DataOutputStream menangani penyimpanan data dan PrintStream menangani tampilan
6. Ubah perilaku aliran
Meskipun BufferedOutputStream adalah subkelas dari FilterOutputStream, BufferedWriter bukan subkelas dari FilterWriter (FilterWriter adalah kelas abstrak dan tidak memiliki subkelas apa pun)
Tidak ada kelas yang sesuai untuk DataInputStream. Gunakan DataInputStream kecuali Anda menggunakan BufferedReader saat Anda ingin menggunakan readLine()
BufferedReader: sesuai dengan BufferedInputStream
LineNumberReader: Sesuai dengan LineNumberInputStream
PushBackReader: Sesuai dengan PushbackInputStream
BufferedWrite: sesuai dengan BufferedOutStream
PrintWrite: sesuai dengan PrintStream
7. Kelas mandiri: RandomAccessFile
Kelas ini cocok untuk file yang terdiri dari catatan dengan ukuran yang diketahui. Selain mengimplementasikan antarmuka DataInput dan DataOutput (DataInputStream dan DataOutputStream juga mengimplementasikan kedua antarmuka ini), RandomAccessFile adalah kelas yang sepenuhnya independen. Ia memiliki dan memiliki tipe I/O lainnya perilaku yang berbeda, dapat bergerak maju dan mundur dalam sebuah file, dan diturunkan langsung dari Object.
Operasi baca dan tulis pada file dapat diselesaikan melalui objek RandomAccessFile.
Saat membuat objek, Anda dapat menentukan sifat file yang akan dibuka: r, read-only; w, write-only;
Anda dapat melompat langsung ke lokasi yang ditentukan dalam file
Sebagian besar (tetapi tidak semua) fungsi RandomAccessFile telah digantikan oleh file pemetaan penyimpanan nio