SORU
4 Mart 2009, ÇARŞAMBA


Java okuyun engelleme İnputStream

Java apı göre, InputStream.read() olarak tanımlanır:

Eğer bayt çünkü varsa akışın sonuna ulaşıldı, -1 değeri döndürülür. Bu yöntem veri girişi kadar engeller mevcut. akışın sonuna algılanacak bir özel durum.

while(true) bir döngü bir okuma yapıyor ve ben her zaman bir şey derenin üzerinden gönderilen zaman -1 olsun. Bu bekleniyor.

Sorumu okur zaman() hiç blok? Eğer herhangi bir veri yok ise olmadığına göre -1 ile döner. Veri alınıncaya kadar engelleyici okuma beklemesini beklerdim. Eğer giriş akışın sonuna ulaştınız, okumamalı() sadece -1 döndürmek yerine veri bekliyor?

Ya da okuyor mu() eğer başka bir iş parçacığı akış ve okuma erişim eğer orada blok sadece() akış erişimi?

< / ^ hr .

Bir sonraki soruya götürüyor. Veri kullanılabilir olduğunda bana bildir ki olay dinleyicisi vardı (benim kütüphane tarafından sağlanan). Haberdar olduğumda while((aByte = read()) > -1) mağaza bayt derim. Yakınlık ve tüm verilerimi değil sergileniyordu çok yakın zamanda İKİ olay ne zaman alacağımı şaşırdım. İkinci olay verilerinin sadece kuyruk sonunda görüntülenir ve geri kalan eksik olduğunu görünüyordu.

Sonunda bir olay geldiğimde if(inputStream.available() > 0) while((aByte = read()) > -1) mağaza byte denir ben de kodu değişti. Şimdi düzgün bir şekilde çalıştı ve tüm verileri ekrana geldi.

Bu davranış, birisi açıklayabilir mi? InputStream.available() sonraki arayan (akış?) bloklaşma okuyabilirsiniz bayt sayısını döndürmek için söylenir. Eğer kullanmıyorum bile .() mevcut ilk olay okumak sadece ikinci olay okuma bloğu, ama ya çok fazla veri akışı silmek tüketmek değil tahmin ediyorum. Bunu neden benim tüm verilerin görüntülenmesine neden olur?

CEVAP
4 Mart 2009, ÇARŞAMBA


InputStream bazı uygulamalar için temel veri kaynağı akışın sonuna ulaşıldı sinyal, ve daha fazla veri gönderilir. Bu sinyal alınıncaya kadar, bu tür bir akım üzerinde okuma işlemleri engelleyebilirsiniz.

Örneğin, Socket yuva InputStream bir FİN bayrağı ayarlanmış bir TCP paketi alınıncaya kadar, EOF döndürmek yerine, engeller. EOF böyle bir akış alındığında, tüm veri soket güvenilir alındığını gönderilen emin olabilirsiniz, ve daha fazla veri okumak mümkün olmayacaktır. Eğer bir engelleme okuyun, özel bir durum oluşur ise, diğer taraftan, bazı veriler kaybolmuş olabilir.)

Diğer akarsuları, ham bir dosya ya da seri port gibi, benzer bir biçim veya protokol daha fazla veri kullanılabilir olduğunu belirtmek için olmayabilir. Bu derelerin hemen hiçbir veri mevcut olduğunda engelleme yerine EOF (-1) dönebilirsiniz. Bu tür biçim veya protokol yokluğunda, ancak, diğer taraftan veri gönderme bittiği zaman emin olamazsın.


İkinci sorunuza gelince, bir yarış durumu olmuş olabilir gibi geliyor. Söz konusu kod görmeden, sorun aslında sizin yöntem yattığını tahmin ediyorum "görüntü". Belki de ikinci bildirim görüntüleme girişimi bir şekilde bu işe ilk bildirim sırasında yapılan clobbering.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Fubar Protocol

    Fubar Protoc

    21 AĞUSTOS 2010
  • Manuel Vizcaino

    Manuel Vizca

    27 Mayıs 2008
  • RFS Dan

    RFS Dan

    22 Temmuz 2014