2012-09-17 20 views
6

NeGiriş akışı.read return 0 veya -1?

byte[] buffer = new byte[1024]; 
// this: 
if (inputStream.read(buffer) > 0) { /*...*/ } 
// and: 
if (inputStream.read(buffer) != -1) { /*...*/ } 

arasındaki fark ağ akışı sona belirleyebilir hem?

+16

İlki, inputstream.read() == 0' algılamıyor, bu geçerli bir yanıttır. –

+2

Belkide> = 0 mu demek istediniz? – Gabber

+6

http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#read%28byte[]%29. Hepsi api belgesinde açıklandı. Hiçbir veri yoksa –

cevap

9

InputStream.read() için javadocs ki:

b uzunluğu o zaman hiçbir byte okunur ve 0 bu hiçbir zaman olmamalıdır, Normal kullanımda

döndü, bu yüzden orada olup, sıfır ise Bu durumun açık bir şekilde test edilmesine çok fazla gerek yok. (Eğer tampon sıfır uzunluklu ve başarısız hızlı bu durumda çünkü sonsuza döngü kaçınmak istiyorsanız, sadece tampon uzunluğunu test edin.)

Dahası, var:

İade: arabelleğe okunan toplam bayt sayısı veya akış sonuna ulaşıldığı için daha fazla veri yoksa -1.

için test etmek isterseniz sonu dosyanın (veya ağ akımına ya da her neyse), test kullanın:

if (inputStream.read(buffer) != -1) ... 

olmayan bir arabası Java uygulaması başka bir şey asla dönecektir Daha fazla veri bulunmadığını belirtmek için.

+0

... bekle, ne? Son paragrafınızda '! = 0' yerine'! = -1 'yazmayı mı kastettiniz? –

+0

@IlmariKaronen Üzgünüz, '-1' olması gerekiyor, bunun için teşekkürler. Temel olarak "dokümanlar size açıkça söylemenizi söyler." – millimoose

2

doc, inputstream.read(buffer) !=-1, akışın sona erdiğini size bildirecektir. inputstream.read(buffer) == 0 sadece okunacak bayt bulunmadığını ancak akımın hala aktif olduğunu söylüyor (yani, akranız her şeyi okuyabildiğinizden beri hiçbir şey göndermedi).

+1

'InputStream' engeller. Ne demek istediğin anlamına gelmez. – millimoose

İlgili konular