2009-06-30 11 views
83

क्या कंसोल से एकल char को पढ़ने का कोई आसान तरीका है क्योंकि उपयोगकर्ता इसे जावा में टाइप कर रहा है? क्या यह संभव है? मैं इन तरीकों के साथ की कोशिश की है लेकिन वे सभी उपयोगकर्ता के लिए प्रतीक्षा प्रेस करने कुंजी दर्ज करें:जावा में कंसोल से एक एकल को कैसे पढ़ा जाए (जैसे उपयोगकर्ता इसे टाइप करता है)?

char tmp = (char) System.in.read(); 
char tmp = (char) new InputStreamReader(System.in).read(); 
char tmp = (char) System.console().reader().read();   // Java 6 

मुझे लगता है कि करने के लिए है कि System.in उपयोगकर्ता इनपुट के बारे में पता तक दर्ज है नहीं है शुरू कर दब गया।

उत्तर

50

आप क्या करना चाहते हैं कंसोल को "पकाया गया" मोड ("पका हुआ" मोड (लाइन कुंजी संपादन के साथ लाइन संपादन) के विपरीत "कच्चे" मोड (लाइन संपादन बाईपास किया गया है और कोई भी आवश्यक कुंजी) में डाल दिया गया है। यूनिक्स सिस्टम पर, ' stty 'कमांड मोड बदल सकते हैं।

अब, जावा के संबंध में ... Non blocking console input in Python and Java देखें। अंश:

अपने कार्यक्रम आधारित सांत्वना होना चाहिए, तो आप चरित्र मोड में अपने टर्मिनल बाहर स्विच करने के लिए लाइन मोड के , और इसे पुनर्स्थापित करने से पहले अपने कार्यक्रम इस्तीफा याद है । सिस्टम ऑपरेटिंग में ऐसा करने के लिए कोई पोर्टेबल तरीका नहीं है।

सुझावों में से एक जेएनआई का उपयोग करना है। फिर, यह बहुत पोर्टेबल नहीं है। धागे के अंत में एक और सुझाव, और उपरोक्त पद के साथ आम तौर पर jCurses का उपयोग करना है।

+4

JCurses बहुत पोर्टेबल नहीं है या तो .... JCurses README से: "JCurses दो हिस्से होते हैं: plattform स्वतंत्र हिस्सा, और plattform निर्भर भाग, जिसमें देशी साझा लाइब्रेरी शामिल होती है जो पहले भाग में उपलब्ध आदिम इनपुट और आउटपुट ऑपरेशंस बनाती है। " –

+2

@RyanFernandes मेरे लिए काफी पोर्टेबल लगता है - एकल उपकरण जिसे कई प्रणालियों पर चलाया जा सकता है (विभिन्न निर्भरताओं का उपयोग करके) – Antoniossss

20

आपको अपने कंसोल को कच्चे मोड में दस्तक देने की आवश्यकता है। वहां पहुंचने का कोई अंतर्निहित प्लेटफॉर्म-स्वतंत्र तरीका नहीं है। jCurses might be interesting, though.

एक यूनिक्स प्रणाली पर, यह काम हो सकता है:

String[] cmd = {"/bin/sh", "-c", "stty raw </dev/tty"}; 
    Runtime.getRuntime().exec(cmd).waitFor(); 

For example, if you want to take into account the time between keystrokes, here's sample code to get there.

+0

लिनक्स – MrSmith42

+0

के तहत मेरे लिए ठीक काम किया मैक पर भी काम किया। आप संभवतः उल्लेख करना चाहते हैं कि 'stty पकाया Kelvin

+0

"उदाहरण के लिए ..." लिंक अब मर चुका है। –

13

एक जावा कंसोल से कच्चे वर्णों को पढ़ने के कोई पोर्टेबल तरीका नहीं है।

कुछ प्लेटफॉर्म-निर्भर वर्कअराउंड ऊपर प्रस्तुत किए गए हैं। लेकिन वास्तव में पोर्टेबल होने के लिए, आपको कंसोल मोड छोड़ना होगा और विंडोिंग मोड का उपयोग करना होगा, उदा। एडब्ल्यूटी या स्विंग।

+11

मुझे समझ में नहीं आता क्यों उदाहरण के लिए मोनो (या सीएलआर) में 'System.Console.ReadKey' है जो सभी प्लेटफ़ॉर्म पर काम करता है। जावा प्लेटफार्म निर्भर पुस्तकालयों और कार्यान्वयन के साथ प्रत्येक मंच के लिए जेवीएम और जेआरई भी वितरित करता है, इसलिए यह कोई बहाना नहीं है। –

6

मैंने जावा क्लास RawConsoleInput लिखा है जो JNA का उपयोग विंडोज और यूनिक्स/लिनक्स के ऑपरेटिंग सिस्टम कार्यों को कॉल करने के लिए करता है।

  • Windows पर यह _kbhit() और _getwch() msvcrt.dll से उपयोग करता है।
  • यूनिक्स पर यह कंसोल से बाइट पढ़ने के लिए डेटा उपलब्ध है या System.in.read() जांचने के लिए कंसोल को गैर-कैनोलिक मोड, System.in.available() पर स्विच करने के लिए tcsetattr() का उपयोग करता है। CharsetDecoder बाइट्स को वर्णों में परिवर्तित करने के लिए प्रयोग किया जाता है।

यह गैर-अवरुद्ध इनपुट का समर्थन करता है और कच्चे मोड और सामान्य लाइन मोड इनपुट को मिलाता है।

+0

इसका परीक्षण/तनाव परीक्षण कितना भारी है? –

+1

@QPaysTaxes तनाव-परीक्षण कंसोल इनपुट के लिए मुश्किल है। मुझे लगता है कि, इस मामले में विभिन्न परिवेशों (विभिन्न विंडोज/लिनक्स संस्करण, 64/32 बिट, एसएसएच, टेलनेट, सीरियल पोर्ट या डेस्कटॉप कंसोल आदि के माध्यम से लिनक्स) में इसका परीक्षण करना अधिक महत्वपूर्ण होगा। अब तक मैं केवल अपने निजी परीक्षण उपकरणों में इसका उपयोग करता हूं। लेकिन अन्य समाधानों की तुलना में स्रोत कोड अपेक्षाकृत छोटा है (जैसे जेएलआईएन 2 जो जांसी का उपयोग करता है)। तो वहां बहुत कुछ नहीं है जो गलत हो सकता है। मैंने इसे लिखा, क्योंकि JLine2 अवरुद्ध किए बिना एकल वर्ण इनपुट का समर्थन नहीं करता है। –

+0

तनाव-परीक्षण से मेरा यही मतलब है - यह शायद गलत शब्द है; मेरी गलती। वैसे भी, अच्छा! मैंने चोरी की है^एच^एच^एच^एच^एच^हूज्ड इट इन ए प्रोजेक्ट ऑफ माइन फॉर स्कूल और इससे एक गुच्छा की मदद मिली। –

0

उपयोग jline3:

उदाहरण:

Terminal terminal = TerminalBuilder.builder() 
    .jna(true) 
    .system(true) 
    .build(); 

// raw mode means we get keypresses rather than line buffered input 
terminal.enterRawMode(); 
reader = terminal .reader(); 
... 
int read = reader.read(); 
.... 
reader.close(); 
terminal.close(); 
संबंधित मुद्दे

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