2014-09-17 11 views
5

Im vs/IP Soket uygulamasıDataInputStream.read() DataInputStream.readFully() basit TCP yapma

nedir bunu arasındaki farklı:

DataInputStream in = new DataInputStream(clientSocket.getInputStream()); 

byte[] buffer = new byte[100]; 
in.read(buffer); 
: Bunu yaparken karşı

DataInputStream in = new DataInputStream(clientSocket.getInputStream()); 

byte[] buffer = new byte[100]; 
in.readFully(buffer); 

Dokümanlara bir göz attım, aynı açıklamaya sahipler. readFully() ve read() Aynı şeyin aynısını alabilir miyim?

+0

EOF (soket üzerinde okunacak daha fazla bayt bulunmadığı zaman) işlemek nasıl yapılır? İki tanığın tanımlarına bakın, sadece açıklamaları değil. Biri bir değer döndürür ve bir istisna atar. – scrappedcola

+0

@scrappedcola oh tamam, şimdi anlıyorum. Yani, temelde, readFully() ', okunacak daha fazla bayt varsa, arabellek dolduğunda döner. Ve tüm readtes okunduğunda 'read()' döndürür. Doğru? – Krimson

+0

Hayır. Read() ', en az bir bayt okunduğunda döndürür; buffer doldurulduğunda readFully(). – EJP

cevap

9

DataInput.readFully(byte[] b) durumları için Javadoc:

tampon dizi b bir girdi akımı ve saklar bazı bayt okur. Okunan bayt sayısı b uzunluğuna eşittir.

DataInputStream.read(byte[] b) durumları için Javadoc:

tampon dizisi b içerisinde bulunan girdi akışından bayt ve depolar bazıları sayısını okur. Gerçekte okunan bayt sayısı, tamsayı olarak döndürülen 'dır. Bu yöntem, giriş verileri kullanılabilir olana kadar engellenir, dosya sonu algılandı veya'a bir istisna atılır. read()b.length, girdi akışından kullanılabilir ne olursa olsun, belki daha az kadar okuyacak ise

Temel olarak, readFully(), tamb.length bayt okuyacaktır.

+1

mükemmel, düşündüğüm buydu. Açıklama için teşekkürler – Krimson

+3

Ben 'readFully() '** ağ tabanlı operasyonlarda ** daha iyi olduğunu ekleyebilirim. Ben uzun mesajlar gönderirken sadece 'read() 'ile ilgili sorunlar yaşadım (örneğin, 5K bayt ** üzerinde tampon). Sadece 'read()' kullanıldığında mesajın bir kısmı eksik ve '' 'karakterleri ile değiştirildi. 'ReadFully()' işlevini kullanmak sorunu çözdü: tam mesaj okundu, hiçbir karakter eksik değil. ;-) Umarım yardımcı olur ! ;-) – Mackovich

+0

Zaman aşımı sonrasında yapmam gerekirse readFully() yöntemini nasıl keserim? – user2602807

0

kullanma gerçekten olmuş 100 bayt okunamadı eğer bir IOException atılacaktır readFully, don ile

byte[] buffer = new byte[100]; 
if (in.read(buffer) < 100){ 
    // fail 
    } 

yerine okudum kaç bayt bilmek dönüş değerini kontrol etmeliyiz okumak Dönüş değerini kontrol etmeli, biraz basitleştirin.