2013-03-19 21 views
5

BufferedReader.readLine() ürününün askıda kalmasının bir yolu var mı? İstemci herhangi bir giriş teslim etti iseBufferedReader.readLine() nasıl askıda kalmaz?

  • Çekler:

    Ben bir sunucu yaratıyorum.

  • Değilse, başka bir kod yürütür ve sonunda giriş için istemciyi denetlemeye geri döner.

İstemcinin readLine()'u çalıştırmadan herhangi bir girdi sağlayıp sağlamadığını nasıl kontrol edebilirim? readLine() çalıştırırsam, giriş iletilene kadar iş parçacığı askıda kalacak mı?

+2

Neden? Sunucu, engelleme G/Ç kullanıyorsanız, her istemci için ayrı bir okuma iş parçacığına sahip olmalıdır. – EJP

+0

Her kullanıcı için iki konu oluşturmak istemiyorum. Her kullanıcı için zaten bir iş parçacığım var. – Cin316

+1

Bu, Java'nın I/O kütüphanesinin talihsiz gerçekliğidir. Ya da 1) okumak için ayrı konuları döndürün 2) NIO kitaplığını kullanın 3) readLine() öğesini kullanmayın ve kendi arabelleğe alma ve satır sonu yönetiminizi kendiniz yapın – creechy

cevap

8

Bunu, BufferedReader.ready() kullanabilirsiniz: girdi kaynağı okundu edilmemiştir akışı içine bir şey koymak olmadıysa

BufferedReader b = new BufferedReader(); //Initialize your BufferedReader in the way you have been doing before, not like this. 

if(b.ready()){ 
    String input = b.readLine(); 
} 

ready()true dönecektir.

Düzenleme: Sadece bir karakter bile mevcut olduğunda, bir not, hazır true dönecektir. Satır besleme veya satır başı dönüşü olup olmadığını kontrol etmek için read()'u kullanabilir ve bunlar satırın sonunu gösterir.

Daha fazla bilgi için: http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#ready()

+7

Bu yalnızca, 'read() 'için sonraki çağrı engellenmiyor mu? Link, readLine() 'hakkında hiçbir şey söylemiyor. – Keppil

+2

Hazır olsa bile, yalnızca en az bir bayt olduğu anlamına gelir, tam olarak bir satır olmamalıdır. Bu her durumda çalışmayabilir, ancak şansınız olabilir ve yaptığınız şey için işe yarayacaktır. – TofuBeer

İlgili konular