"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? |
---|---|
|
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) |
|
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. |
|
Bu yöntem okunmamış (mevcut) bayt sayısını döndürür. |
|
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? |
---|---|
|
Bu yöntem bir bayt yazar. int türü bir bayta daraltılmıştır. Ekstra kısım basitçe atılır. |
|
Bu yöntem bir bayt bloğu yazar. |
|
Bu yöntem, bir bayt bloğunun bir kısmını yazar. Bayt dizisinin tamamen doldurulmamış olabileceği durumlarda kullanılır. |
|
Akış, henüz yazılmamış herhangi bir veriyi dahili olarak depoluyorsa, bu yöntem onu yazılmaya zorlar. |
|
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:"
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."