2013-03-19 5 views
5

वहाँ BufferedReader.readLine() लटका नहीं बनाने के लिए एक तरीका है?आप BufferedReader.readLine() लटका नहीं कैसे कर सकते हैं?

  • जांच करें कि क्या ग्राहक किसी भी इनपुट जन्म दिया है:

    मैं एक सर्वर है कि बना रहा हूं।

  • यदि नहीं, तो यह अन्य कोड निष्पादित करता है और अंत में वापस निवेश के लिए ग्राहक की जाँच करने के लिए लूप।

मैं कैसे जांच सकता हूं कि क्लाइंट ने readLine() चलाने के बिना कोई इनपुट दिया है या नहीं? यदि मैं readLine() चलाता हूं, तो इनपुट वितरित होने तक थ्रेड लटका होगा?

+2

क्यों? यदि आप अवरुद्ध I/O का उपयोग कर रहे हैं, तो सर्वर के प्रति क्लाइंट एक अलग रीडिंग थ्रेड होना चाहिए। – EJP

+0

मैं प्रत्येक उपयोगकर्ता के लिए दो धागे बनाने के लिए नहीं करना चाहती। मेरे पास प्रत्येक उपयोगकर्ता के लिए पहले से ही एक धागा है। – Cin316

+1

यह जावा की आई/ओ लाइब्रेरी की दुर्भाग्यपूर्ण वास्तविकता है। आप या तो 1) पढ़ने के लिए अलग थ्रेड स्पिन करें 2) एनआईओ लाइब्रेरी का उपयोग करें 3) readLine() का उपयोग न करें और अपने स्वयं के बफरिंग और एंड-ऑफ-लाइन प्रबंधन को स्वयं करें – creechy

उत्तर

8

आप इस तरह BufferedReader.ready() उपयोग कर सकते हैं,:

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 वापस आ जाएगी, तो इनपुट के स्रोत धारा है कि पढ़ नहीं किया गया में कुछ भी नहीं दिया है।

संपादित करें: बस एक नोट तैयार true वापस आ जाएगी जब भी भी केवल एक ही चरित्र मौजूद है। आप अगर वहाँ एक लाइन फ़ीड या गाड़ी वापसी है की जाँच करने के read() उपयोग कर सकते हैं, और उन लाइन के अंत का संकेत होगा।

अधिक जानकारी के लिए: http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#ready()

+7

क्या यह केवल गारंटी नहीं देता है 'read() 'को अगली कॉल ब्लॉक नहीं करता है? लिंक 'readLine() 'के बारे में कुछ भी नहीं कहता है। – Keppil

+2

भले ही यह तैयार हो, केवल इसका मतलब है कि कम से कम एक बाइट है, जरूरी नहीं कि पूरी लाइन हो। यह सभी मामलों में जरूरी नहीं है, हालांकि आप भाग्यशाली हो सकते हैं और यह आपके काम के लिए काम करेगा। – TofuBeer

संबंधित मुद्दे