1. OutputStream
kelas
Kami baru sahaja meneroka aliran input. Sudah tiba masanya untuk bercakap tentang aliran keluaran.
Kelas OutputStream
ialah kelas induk untuk semua kelas yang menyokong output bait. Ini ialah kelas abstrak yang tidak melakukan apa-apa dengan sendirinya, tetapi ia mempunyai kelas turunan untuk setiap kesempatan.
Kedengarannya sangat rumit. Untuk meletakkannya dengan lebih mudah, kelas ini beroperasi pada bait, dan bukan, sebagai contoh, aksara atau jenis data lain. Dan hakikat bahawa ia adalah abstrak bermakna bahawa kita biasanya tidak menggunakannya, sebaliknya salah satu daripada kelas keturunannya. Contohnya, FileOutputStream
dan seumpamanya.
Tetapi kembali ke OutputStream
kelas. Kelas ini mempunyai kaedah yang mesti dilaksanakan oleh semua kelas keturunannya. Berikut adalah yang utama:
Kaedah | Penerangan |
---|---|
|
Menulis satu bait (bukan an int ) ke strim. |
|
Menulis tatasusunan bait ke strim |
|
Menulis sebahagian daripada tatasusunan bait ke strim |
|
Menulis semua data yang disimpan dalam penimbal ke strim |
|
Menutup strim |
Apabila anda mencipta objek kelas yang mewarisi InputStream
, anda biasanya menentukan objek sumber yang InputStream
membaca data daripadanya. Apabila anda mencipta objek kelas yang mewarisi OutputStream
, anda juga biasanya menentukan objek sasaran atau strim yang data akan ditulis.
Mari kita lihat secara ringkas semua kaedah kelas OutputStream
:
write(int b)
kaedah
Kaedah ini menulis satu bait (bukan an int
) kepada aliran keluaran. Nilai yang dihantar dihantar ke bait, dan tiga bait pertama int dibuang.
write(byte[] buffer)
kaedah
Menulis tatasusunan bait yang diberikan kepada aliran keluaran. Itu sahaja.
write(byte[] buffer, int offset, int length)
kaedah
Menulis sebahagian daripada tatasusunan bait yang diluluskan kepada aliran keluaran. Pembolehubah mengimbangi menunjukkan indeks elemen pertama tatasusunan, dan length
ialah panjang subset yang akan ditulis.
flush()
kaedah
Kaedah ini flush()
digunakan untuk memaksa mana-mana data yang berpotensi buffer dalam aliran semasa untuk ditulis ke aliran sasaran. Ini berkaitan apabila menggunakan penimbalan dan/atau objek berbilang aliran yang disusun dalam rantai.
close()
kaedah
Menulis sebarang data tidak bertulis kepada objek sasaran. Kaedah close()
tidak perlu dipanggil jika anda menggunakan try-with-resources
blok.
Contoh menyalin fail
Kod | Catatan |
---|---|
|
InputStream untuk membaca dari fail OutputStream untuk menulis ke fail Penampan di mana kita akan membaca data Selagi terdapat data dalam aliran Baca data ke dalam penimbal Tulis data dari penimbal ke aliran kedua |
2. Writer
kelas
Kelas Writer
adalah sama dengan OutputStream
kelas, tetapi hanya satu perbezaan sekali lagi: ia berfungsi dengan aksara ( char
) dan bukannya bait.
Ini ialah kelas abstrak: anda tidak boleh mencipta objek kelas Writer
. Matlamat utamanya adalah untuk menjadi kelas induk biasa untuk ratusan kelas keturunan dan memberi mereka kaedah biasa untuk bekerja dengan aliran aksara.
Kaedah kelas Writer
(dan semua kelas keturunannya):
Kaedah | Penerangan |
---|---|
|
Menulis satu aksara (bukan satu int ) ke strim. |
|
Menulis tatasusunan aksara ke strim |
|
Menulis sebahagian daripada tatasusunan aksara ke strim |
|
Menulis rentetan ke strim |
|
Menulis sebahagian daripada rentetan kepada strim |
|
Menulis semua data yang disimpan dalam penimbal ke strim |
|
Menutup strim |
Kaedah ini sangat serupa dengan kaedah kelas OutputStream
, tetapi ia berfungsi dengan aksara dan bukannya bait.
Penerangan kaedah:
write(int b)
kaedah
Kaedah ini menulis satu aksara ( char
— bukan an int
) kepada aliran keluaran. Nilai yang diluluskan dibuang ke a char
, dan dua bait pertama dibuang.
write(char[] buffer)
kaedah
Menulis tatasusunan aksara yang diberikan kepada aliran keluaran.
write(char[] buffer, int offset, int length)
kaedah
Menulis sebahagian daripada tatasusunan aksara yang diluluskan ke aliran keluaran. Pembolehubah offset
menunjukkan indeks elemen pertama tatasusunan, dan length
ialah panjang subset yang akan ditulis.
write(String str)
kaedah
Menulis rentetan yang diberikan kepada aliran keluaran.
write(String str, int offset, int length)
kaedah
Menulis sebahagian daripada rentetan yang diberikan kepada aliran keluaran: rentetan itu ditukar kepada tatasusunan aksara. Pembolehubah offset
menunjukkan indeks elemen pertama tatasusunan, dan length
ialah panjang subset yang akan ditulis.
flush()
kaedah
Kaedah ini flush()
digunakan untuk memaksa mana-mana data yang berpotensi buffer dalam aliran semasa untuk ditulis ke aliran sasaran. Ini berkaitan apabila menggunakan penimbalan dan/atau objek berbilang aliran yang disusun dalam rantai.
close()
kaedah
Menulis sebarang data tidak bertulis kepada objek sasaran. Kaedah close()
tidak perlu dipanggil jika anda menggunakan try-with-resources
blok.
Contoh program yang menyalin fail teks:
Kod | Catatan |
---|---|
|
Reader untuk membaca dari fail Writer untuk menulis ke fail Penampan di mana kita akan membaca data Selagi terdapat data dalam aliran Baca data ke dalam penimbal Tulis data dari penimbal ke aliran kedua |
StringWriter
kelas
Terdapat satu lagi kelas menarik yang mewarisi Writer
kelas: ia dipanggil StringWriter
. Ia mengandungi rentetan boleh ubah — StringBuffer
objek. Dan setiap kali anda "menulis" sesuatu pada StringWriter
objek, teks itu hanya ditambahkan pada penimbal dalamannya.
Contoh:
Kod | Catatan |
---|---|
|
Strim aksara sasaran ( StringWriter ) dicipta Rentetan ditulis kepada penimbal di dalam StringWriter Rentetan ditulis kepada penimbal di dalam StringWriter Menukar kandungan objek kepada rentetan |
Dalam kes ini, StringWriter
kelas pada asasnya ialah pembalut ke atas StringBuffer
kelas, tetapi StringWriter
kelas itu adalah keturunan Writer
kelas aliran, dan ia boleh digunakan dalam rantaian objek aliran. Ini adalah harta yang cukup berguna dalam amalan.
3. PrintStream
kelas
Kelas aliran output juga boleh dimasukkan ke dalam rantaian dengan aliran perantara yang menulis data ke aliran sasaran yang dihantar kepada mereka. Pandangan umum interaksi aliran ini kelihatan seperti ini:
Yang paling menarik dan serba boleh daripada semua aliran keluaran perantaraan ialah PrintStream
. Ia mempunyai berpuluh-puluh kaedah dan sebanyak 12 pembina.
Kelas PrintStream
mewarisi FilterOutputStream
kelas, yang mewarisi OutputStream
. Ini bermakna bahawa PrintStream
kelas mempunyai semua kaedah kelas induk sebagai tambahan kepada kaedahnya sendiri . Berikut adalah yang paling menarik:
Kaedah | Penerangan |
---|---|
|
Menukar objek yang diluluskan kepada rentetan dan mengeluarkannya kepada aliran sasaran. |
|
Menukar objek yang diluluskan kepada rentetan dan mengeluarkannya kepada aliran sasaran. Menambah pemisah baris pada penghujung |
|
Mengeluarkan watak pemisah baris ke aliran sasaran |
|
Membina dan mengeluarkan rentetan berdasarkan rentetan format dan hujah yang diluluskan; serupa dengan String.format() kaedah |
Dan di manakah berpuluh-puluh kaedah ini, anda bertanya?
Nah, ia mempunyai banyak varian print()
dan println()
kaedah dengan parameter yang berbeza. Mereka boleh diringkaskan dalam jadual ini.
Kami tidak akan menyelami kaedah ini, kerana anda sudah mengetahuinya dengan baik. Bolehkah anda meneka apa yang saya dapat?
Ingat tak System.out.println()
? Tetapi ia boleh ditulis dalam dua baris:
Kod | Output konsol |
---|---|
|
|
Perintah kegemaran kami ialah panggilan kepada kaedah pada pembolehubah statik kelas . Dan jenis pembolehubah ini ialah .System.out.println()
println()
out
System
PrintStream
Dalam banyak peringkat CodeGym, dan dalam hampir setiap tugas, anda telah memanggil kaedah kelas PrintStream
tanpa mengetahuinya!
Penggunaan praktikal
Java mempunyai kelas yang menarik ini dipanggil ByteArrayOutputStream
, yang merupakan tatasusunan bait yang berkembang secara dinamik yang mewarisi OutputStream
.
Objek ByteArrayOutputStream
dan PrintStream
objek boleh dirantai seperti ini:
Kod | Penerangan |
---|---|
|
Cipta penimbal tulis dalam ingatan Balut penimbal dalam PrintStream objek Tulis data ke konsol Tukar tatasusunan kepada rentetan! Output konsol:
|