1. OutputStreamkelas

Kami baru saja menjelajahi input stream. Saatnya berbicara tentang aliran keluaran.

Kelas OutputStreamadalah kelas induk untuk semua kelas yang mendukung output byte. Ini adalah kelas abstrak yang tidak melakukan apa-apa sendiri, tetapi memiliki kelas turunan untuk setiap kesempatan.

Kedengarannya sangat rumit. Sederhananya, kelas ini beroperasi pada byte, dan bukan, misalnya, karakter atau tipe data lainnya. Dan fakta bahwa itu abstrak berarti kita biasanya tidak menggunakannya, melainkan salah satu kelas turunannya. Misalnya, FileOutputStreamdan sejenisnya.

Tapi kembali ke OutputStreamkelas. Kelas ini memiliki metode yang harus diterapkan oleh semua kelas turunannya. Inilah yang utama:

Metode Keterangan
void write(int b)
Menulis satu byte (bukan int) ke aliran.
void write(byte[] buffer)
Menulis array byte ke aliran
void write(byte[] buffer, off, len)
Menulis bagian dari array byte ke aliran
void flush()
Menulis semua data yang disimpan dalam buffer ke aliran
void close()
Menutup aliran

Saat Anda membuat objek dari kelas yang mewarisi InputStream, Anda biasanya menentukan objek sumber tempat InputStreamdata dibaca. Saat Anda membuat objek dari kelas yang mewarisi OutputStream, Anda juga biasanya menentukan objek target atau aliran data yang akan ditulis.

Mari kita bahas secara singkat semua metode kelas OutputStream:

write(int b)metode

Metode ini menulis satu byte (bukan int) ke aliran keluaran. Nilai yang diteruskan dilemparkan ke satu byte, dan tiga byte pertama dari int dibuang.

write(byte[] buffer)metode

Menulis array byte yang diberikan ke aliran output. Itu dia.

write(byte[] buffer, int offset, int length)metode

Menulis sebagian dari array byte yang diteruskan ke aliran keluaran. Variabel offset menunjukkan indeks elemen pertama dari array, dan lengthmerupakan panjang subset yang akan ditulis.

flush()metode

Metode ini flush()digunakan untuk memaksa data apa pun yang berpotensi disangga dalam aliran saat ini untuk ditulis ke aliran target. Ini relevan saat menggunakan buffering dan/atau beberapa objek aliran yang diatur dalam sebuah rantai.

close()metode

Menulis data tidak tertulis apa pun ke objek target. Metode close()tidak perlu dipanggil jika Anda menggunakan try-with-resourcesblok.

Contoh menyalin file

Kode Catatan
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileInputStream input = new FileInputStream(src);
FileOutputStream output = new FileOutputStream(dest))
{
   byte[] buffer = new byte[65536]; // 64Kb
   while (input.available() > 0)
   {
      int real = input.read(buffer);
      output.write(buffer, 0, real);
   }
}



InputStreamuntuk membaca dari sebuah file
OutputStreamuntuk menulis ke sebuah file

Buffer dimana kita akan membaca data
Selama ada data di dalam stream

Membaca data ke dalam buffer
Menulis data dari buffer ke stream kedua

2. Writerkelas

Kelasnya Writerpersis sama dengan kelasnya OutputStream, tetapi sekali lagi hanya ada satu perbedaan: ia bekerja dengan karakter ( char) bukan byte.

Ini adalah kelas abstrak: Anda tidak dapat membuat objek kelas Writer. Tujuan utamanya adalah menjadi kelas induk umum untuk ratusan kelas keturunan dan memberi mereka metode umum untuk bekerja dengan aliran karakter.

Metode kelas Writer(dan semua kelas turunannya):

Metode Keterangan
void write(int b)
Menulis satu karakter (bukan int) ke aliran.
void write(char[] buffer)
Menulis array karakter ke aliran
void write(char[] buffer, off, len)
Menulis bagian dari array karakter ke aliran
void write(String str)
Menulis string ke aliran
void write(String str, off, len)
Menulis bagian dari string ke aliran
void flush()
Menulis semua data yang disimpan dalam buffer ke aliran
void close()
Menutup aliran

Metodenya sangat mirip dengan metode kelas OutputStream, tetapi mereka bekerja dengan karakter, bukan byte.

Deskripsi metode:

write(int b)metode

Metode ini menulis satu karakter ( char— bukan int) ke aliran keluaran. Nilai yang diteruskan dilemparkan ke a char, dan dua byte pertama dibuang.

write(char[] buffer)metode

Menulis larik karakter yang diberikan ke aliran keluaran.

write(char[] buffer, int offset, int length)metode

Menulis sebagian dari array karakter yang diteruskan ke aliran output. Variabel offsetmenunjukkan indeks elemen pertama dari array, dan lengthmerupakan panjang subset yang akan ditulis.

write(String str)metode

Menulis string yang diberikan ke aliran keluaran.

write(String str, int offset, int length)metode

Menulis sebagian dari string yang diberikan ke aliran output: string diubah menjadi array karakter. Variabel offsetmenunjukkan indeks elemen pertama dari array, dan lengthmerupakan panjang subset yang akan ditulis.

flush()metode

Metode ini flush()digunakan untuk memaksa data apa pun yang berpotensi disangga dalam aliran saat ini untuk ditulis ke aliran target. Ini relevan saat menggunakan buffering dan/atau beberapa objek aliran yang diatur dalam sebuah rantai.

close()metode

Menulis data tidak tertulis apa pun ke objek target. Metode close()tidak perlu dipanggil jika Anda menggunakan try-with-resourcesblok.

Contoh program yang menyalin file teks:

Kode Catatan
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileReader reader = new FileReader(src);
FileWriter writer = new FileWriter(dest))
{
   char[] buffer = new char[65536]; // 128Kb
   while (reader.ready())
   {
      int real = reader.read(buffer);
      writer.write(buffer, 0, real);
   }
}



Readeruntuk membaca dari sebuah file
Writeruntuk menulis ke sebuah file

Buffer dimana kita akan membaca data
Selama ada data di dalam stream

Membaca data ke dalam buffer
Menulis data dari buffer ke stream kedua

StringWriterkelas

Ada kelas menarik lainnya yang mewarisi Writerkelas tersebut: disebut StringWriter. Ini berisi string yang bisa berubah - sebuah StringBufferobjek. Dan setiap kali Anda "menulis" sesuatu ke StringWriterobjek, teks ditambahkan ke buffer internalnya.

Contoh:

Kode Catatan
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.write(String.valueOf(123));

String result = writer.toString();
Aliran karakter target ( StringWriter) dibuat
String ditulis ke buffer di dalam StringWriter
String A ditulis ke buffer di dalam StringWriter

Konversi isi objek menjadi string

Dalam hal ini, StringWriterkelas pada dasarnya adalah pembungkus kelas StringBuffer, tetapi StringWriterkelas tersebut adalah turunan dari Writerkelas aliran, dan dapat digunakan dalam rangkaian objek aliran. Ini adalah properti yang cukup berguna dalam praktiknya.