"Merhaba Amigo! Bugün bir kez daha InputStream ve OutputStream'in nasıl çalıştığını inceleyeceğiz . İlk açıklama aslında biraz basitti. Bunlar arayüz değil. Soyut sınıflar ve hatta birkaç tane uygulanmış yöntemleri var. Sahip oldukları yöntemlere bir göz atalım:"

Giriş Akışı yöntemleri Yöntem ne yapar?
int read(byte[] buff);
Bu yöntem, arabellek dolana kadar veya kaynakta okunacak başka bayt kalmayıncaya kadar arabelleğe ( bayt dizisi ) hemen bir bayt bloğu okur . Yöntem, gerçekte okunan bayt sayısını döndürür (dizinin uzunluğundan daha az olabilir)
int read();
Bu yöntem bir baytı okur ve onu döndürür. Sonuç, görünüm için bir int'e genişletildi. Okunacak başka bayt yoksa, yöntem -1 döndürür.
int available();
Bu yöntem okunmamış (mevcut) bayt sayısını döndürür.
void close();
Bu yöntem akışı "kapatır". Akışla çalışmayı bitirdiğinizde bunu çağırırsınız.
Nesne daha sonra dosyayı vb. kapatmak için gereken temizlik işlemlerini gerçekleştirir.
Bu noktada, akıştan daha fazla veri okuyamazsınız.

"Yani sadece tek baytları değil, tüm blokları da okuyabilir miyiz?"

"Kesinlikle."

"Bütün blokları da yazabilir miyiz?"

"Evet, bak:"

OutputStream yöntemleri Yöntem ne yapar?
void write(int c);
Bu yöntem bir bayt yazar. int türü bir bayta daraltılmıştır. Ekstra kısım basitçe atılır.
void write(byte[] buff);
Bu yöntem bir bayt bloğu yazar.
void write(byte[] buff, int from, int count);
Bu yöntem, bir bayt bloğunun bir kısmını yazar. Bayt dizisinin tamamen doldurulmamış olabileceği durumlarda kullanılır.
void flush();
Akış, henüz yazılmamış herhangi bir veriyi dahili olarak depoluyorsa, bu yöntem onu ​​yazılmaya zorlar.
void close();
Bu yöntem akışı "kapatır". Akışla çalışmayı bitirdiğinizde bunu çağırırsınız.
Nesne daha sonra dosyayı vb. kapatmak için gereken temizlik işlemlerini gerçekleştirir. Artık akışa veri yazamazsınız ve yıkama otomatik olarak çağrılır.

"Tek baytlar yerine tüm blokları aynı anda okursak, dosya kopyalama kodu nasıl görünürdü?"

"Hmm. Bunun gibi bir şey:"

Diskteki bir dosyayı kopyalama
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();
}

"Tamponla ilgili her şeyi anlıyorum ama bu sayma değişkeni nedir?"

"Bir dosyadan en son veri bloğunu okuduğumuzda, örneğin 1000 yerine 328 bayt alabiliriz. Bu nedenle, verileri yazarken, tüm bloğu yazmadığımızı belirtmemiz gerekir; yalnızca ilk 328 bayt bayt."

Son bloğu okuduğumuz zaman, read metodu gerçekte okunan bayt sayısını döndürür. 328'i aldığımızda, son blok hariç, her blok okuduğumuzda 1000.

Yani bir blok yazarken, arabellekteki tüm baytların yazılmaması gerektiğini belirtiriz, sadece 328 (yani, say değişkeninde saklanan değer).

"Artık her şey açık. Teşekkürler Ellie."