"Helo, Amigo! Hari ini kita akan sekali lagi menggali bagaimana InputStream dan OutputStream berfungsi. Penjelasan awal sebenarnya agak ringkas. Ini bukan antara muka. Ia adalah kelas abstrak, malah ia mempunyai beberapa kaedah yang dilaksanakan. Mari kita lihat kaedah yang mereka ada:"

Kaedah InputStream Apakah kaedah yang dilakukan
int read(byte[] buff);
Kaedah ini segera membaca blok bait ke dalam penimbal ( byte array ), sehingga penimbal penuh atau sehingga sumber tidak mempunyai bait lagi untuk dibaca.
Kaedah ini mengembalikan bilangan bait yang sebenarnya dibaca (yang boleh kurang daripada panjang tatasusunan)
int read();
Kaedah ini membaca satu bait dan mengembalikannya. Hasilnya diluaskan kepada int untuk rupa. Jika tiada lagi bait untuk dibaca, kaedah mengembalikan -1.
int available();
Kaedah ini mengembalikan bilangan bait yang belum dibaca (tersedia).
void close();
Kaedah ini «menutup» aliran. Anda memanggil ini apabila anda selesai bekerja dengan strim.
Objek kemudian melakukan operasi pengemasan yang diperlukan untuk menutup fail, dsb.
Pada ketika ini, anda tidak boleh membaca data lagi daripada strim.

"Jadi kita boleh membaca bukan sahaja bait tunggal, tetapi juga keseluruhan blok?"

"Tepat sekali."

"Bolehkah kita juga menulis keseluruhan blok?"

"Ya, semaknya:"

Kaedah OutputStream Apakah kaedah yang dilakukan
void write(int c);
Kaedah ini menulis satu bait. Jenis int dikecilkan kepada bait. Bahagian tambahan dibuang begitu sahaja.
void write(byte[] buff);
Kaedah ini menulis blok bait.
void write(byte[] buff, int from, int count);
Kaedah ini menulis sebahagian daripada blok bait. Ia digunakan dalam kes apabila tatasusunan bait mungkin tidak diisi sepenuhnya.
void flush();
Jika strim menyimpan secara dalaman mana-mana data yang belum ditulis, kaedah ini memaksanya untuk ditulis.
void close();
Kaedah ini «menutup» aliran. Anda memanggil ini apabila anda selesai bekerja dengan strim.
Objek kemudian melakukan operasi pengemasan yang diperlukan untuk menutup fail, dsb. Anda tidak boleh menulis data ke strim lagi dan siram dipanggil secara automatik.

"Apakah rupa kod penyalinan fail jika kita membaca keseluruhan blok pada satu masa dan bukannya bait tunggal?"

"Hmm. Sesuatu seperti ini:"

Salin fail pada cakera
public static void main(String[] args) throws Exception
{
 //Create a stream to read bytes from a file
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 //Create a stream to write bytes to a file
 FileOutputStream outputStream = new FileOutputStream("c:/result.txt");

  byte[] buffer = new byte[1000];
 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  //Read the next block of bytes into buffer, and store the actual number of bytes read in count.
  int count = inputStream.read(buffer);
  outputStream.write(buffer, 0, count); //Write a block (part of a block) to the second stream
 }

 inputStream.close(); //Close both streams. We don't need them any more.
 outputStream.close();
}

"Saya faham segala-galanya tentang penimbal, tetapi apakah pembolehubah kiraan ini?"

"Apabila kita membaca blok data terkini daripada fail, kita mungkin mendapat, katakan, 328 bait dan bukannya 1000. Jadi apabila kita menulis data, kita perlu menunjukkan bahawa kita tidak menulis keseluruhan blok—hanya 328 yang pertama bait."

Apabila kita membaca blok terakhir, kaedah baca akan mengembalikan bilangan bait yang sebenarnya dibaca. 1000 setiap kali kita membaca blok, kecuali blok terakhir, apabila kita mendapat 328.

Jadi apabila kita menulis blok, kita menunjukkan bahawa tidak semua bait dalam penimbal harus ditulis, hanya 328 (iaitu nilai yang disimpan dalam pembolehubah kiraan).

"Sekarang semuanya jelas. Terima kasih, Ellie."