जावा में कंसोल से एक एकल चार्ट कैसे पढ़ें (उपयोगकर्ता इसे टाइप करता है)?


110

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

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 को यूजर इनपुट के बारे में तब तक नहीं पता है जब तक कि एंटर दबाया नहीं जाता।

जवाबों:


57

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

अब, जावा के संबंध में ... पायथन और जावा में नॉन ब्लॉकिंग कंसोल इनपुट देखें । अंश:

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

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


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

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

25

आपको अपने कंसोल को कच्चे मोड में दस्तक देना होगा। वहाँ होने का कोई अंतर्निहित प्लेटफ़ॉर्म-स्वतंत्र तरीका नहीं है। jCurses दिलचस्प हो सकता है, यद्यपि।

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

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

उदाहरण के लिए, यदि आप कीस्ट्रोक्स के बीच के समय को ध्यान में रखना चाहते हैं, तो यहां पहुंचने के लिए यहां का नमूना कोड है।


लिनक्स के तहत मेरे लिए ठीक काम किया
MrSmith42

4
मैक पर भी काम किया। आप शायद यह उल्लेख करना चाहते हैं कि stty cooked </dev/ttyजब प्रोग्राम को बफ़र्ड मोड पर वापस लाने की आवश्यकता होती है, और निश्चित रूप से प्रोग्राम से बाहर निकलने से पहले इसे चलाया जाना चाहिए।
केल्विन

15

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

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


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

13

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

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

यह नॉन-ब्लॉकिंग इनपुट और मिक्सिंग रॉ मोड और नॉर्मल लाइन मोड इनपुट को सपोर्ट करता है।


यह कितनी बार परीक्षण / तनाव-परीक्षण किया गया है?
निधि मोनिका का मुकदमा

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

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

अरे - यह वर्ग बहुत अच्छा लग रहा है। हालाँकि: मैं इसे काम करने के लिए नहीं ला सकता हूँ .. मैं इसे कैसे उपयोग करने वाला हूँ? मैंने CTRL + D (लिनक्स पर) दबाने तक System.in को ब्लॉक करने का सामना किया है और अब मैं कंसोल मोड्स और लाइक्स के बारे में पढ़ता हूं। मुझे लगता है कि आपका रॉकोनसोल इनपुट ऐसा है जिसे मैं ढूंढ रहा हूं - लेकिन मैं इसका उपयोग कैसे करूं?
इगोर

@ आईजीआर एक कीबोर्ड चरित्र को पढ़ने के लिए बस रॉकोनसोलइन्पुटइन्डर (बूलियन) को कॉल करें। यह स्रोत कोड (RawConsoleInput.java) में प्रलेखित है।
क्रिश्चियन डी'ह्योर्यूज

8

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();

मैंने पाया कि RawConsoleInput आधारित समाधान MacOS हाई सिएरा पर काम नहीं करता था; हालाँकि, यह पूरी तरह से काम करता है।
रॉटॉस्ट

jline में व्यावहारिक रूप से आप सभी को एक इंटरैक्टिव कंसोल / टर्मिनल सिस्टम बनाने की आवश्यकता है। यह लिनक्स में बहुत अच्छा काम करता है। अधिक पूर्ण उदाहरण के लिए देखें: github.com/jline/jline3/blob/master/builtins/src/test/java/org/… । इसमें स्वत: पूर्ण, इतिहास, पासवर्ड मास्क, आदि है
lep
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.