उपयोगकर्ता इनपुट को बंद करने के लिए कंसोल प्रतीक्षा करें


81

मेरे पास एक कंसोल एप्लिकेशन है जो अपने कार्यों को करने के बाद, उपयोगकर्ता को फीडबैक देना चाहिए, जैसे "ऑपरेशन पूरा" या "ऑपरेशन विफल" और विस्तृत त्रुटि।

बात यह है, अगर मैं सिर्फ "इसे चलने देता हूं", आउटपुट संदेश मुद्रित हो जाएगा लेकिन कंसोल जल्द ही बंद हो जाएगा, संदेश को पढ़ने के लिए कोई समय नहीं देगा।

जहां तक ​​मुझे याद है, C ++ में, प्रत्येक कंसोल एप्लिकेशन "बाहर निकलने के लिए कोई भी कुंजी दबाएं" या ऐसा कुछ होगा। C # में मैं इस व्यवहार को अनुकरण कर सकता हूं

Console.ReadKey();

लेकिन मैं इसे जावा में कैसे कर सकता हूं? मैं स्कैनर वर्ग का उपयोग कर रहा हूं, लेकिन यह देखते हुए कि "इनपुट" मेरे स्कैनर का उदाहरण है:

input.next()
System.exit(0);

"कोई भी कुंजी" काम करेगी, सिवाय वापसी के, जो यहां काफी बड़ी बात है। कोई संकेत?

जवाबों:


102

जावा में यह होगा System.in.read()


17
यह "प्रेस एंटर टू एग्जिट" को संतुष्ट करता है, लेकिन "बाहर निकलने के लिए किसी भी कुंजी को दबाएं" नहीं, क्योंकि यह तब तक जारी नहीं रहेगा जब तक कि एंटर कुंजी दबाया नहीं जाता है।
नियाल थॉमसन

मुझे लगता है कि "प्रेस एंटर टू एग्जिट" अभी भी "किसी भी कुंजी को एक्सेप्ट करने के लिए बाहर निकलें दर्ज करें" से बेहतर है। धन्यवाद, वही मेरे लिए करेगा।
माकोशी

2
@marcolopes मुझे पार्टी में थोड़ी देर हो गई है, लेकिन जब से आप एक ऐप के बारे में पूछ रहे हैं, तो मैं समस्या का अनुमान लगा रहा हूं कि आप उपयोगकर्ता को जीयूआई या ऐप के भीतर कहीं और दर्ज करें। उन्हें कंसोल में एंटर कुंजी को हिट करने की आवश्यकता है, जो कि सबसे अधिक संभावना केवल तभी दिखाई देगी जब आप इसे आईडीई के भीतर चला रहे हों। यदि आप किसी ऐप के भीतर एंटर दबाना चाहते हैं तो आपको एक अलग समाधान की आवश्यकता होगी।
थंडरफोर्स

4
System.in.read () बिल्कुल एक बाइट पढ़ता है, लेकिन ENTER विभिन्न प्लेटफार्मों पर 1 या अधिक बाइट्स का उत्पादन कर सकता है, विंडोज पर CRLF याद रखें। तो यह हो सकता है कि पढ़ने के बाद की कॉल सीधे पहली कॉल के CRLF से LF लौटाए और इसलिए एप्लिकेशन इनपुट के लिए बिल्कुल भी प्रतीक्षा नहीं करता है।
थोरस्टेन शॉनिंग

जोड़ना import java.io.IOException;भी आवश्यक है।
यू यांग जियान

24

मैं यह जोड़ना चाहूंगा कि आमतौर पर आप यह चाहते हैं कि कार्यक्रम केवल तभी रुक जाए जब वह कंसोल से जुड़ा हो। अन्यथा (जैसे यदि यह एक पाइपलाइन का एक हिस्सा है ) कोई संदेश या प्रतीक्षा मुद्रण बिंदु नहीं है। इसके लिए आप जावा के Consoleइस तरह का उपयोग कर सकते हैं :

import java.io.Console;
// ...
public static void waitForEnter(String message, Object... args) {
    Console c = System.console();
    if (c != null) {
        // printf-like arguments
        if (message != null)
            c.format(message, args);
        c.format("\nPress ENTER to proceed.\n");
        c.readLine();
    }
}

9

जावा कंसोल इनपुट के साथ समस्या यह है कि यह बफर इनपुट है, और जारी रखने के लिए एक एंटर कुंजी की आवश्यकता होती है।

ये दो चर्चाएँ हैं: जावा और जावा कीबोर्ड इनपुट में कंसोल दिशा ऐप में पार्सिंग दिशा कुंजियों का पता लगाना और अभिनय करना

जिनमें से बाद में अपनी समस्या को हल करने के लिए JLine का इस्तेमाल किया।

मैंने व्यक्तिगत रूप से इसका उपयोग नहीं किया है।


7

आप बस nextLine();ठहराव के रूप में उपयोग कर सकते हैं

import java.util.Scanner
//
//
Scanner scan = new Scanner(System.in);

void Read()
{
     System.out.print("Press any key to continue . . . ");
     scan.nextLine();
}

हालाँकि आप इसके अलावा कोई भी बटन दबाते हैं, उसके बाद आपको Enter दबाना Enterहोगा लेकिन मैंने इसे इससे बेहतर पायाscan.next();


आपको उपयोग करने की आवश्यकता हैScanner scan=new Scanner(System.in);
ACV

5

मैंने सरल हैक का उपयोग किया, विंडोज़ को cmd कमांड का उपयोग करने के लिए कहा, और इसे अशक्त करने के लिए भेजा।

// Class for Different hacks for better CMD Display
import java.io.IOException;
public class CMDWindowEffets
{
    public static void getch() throws IOException, InterruptedException
    {
        new ProcessBuilder("cmd", "/c", "pause > null").inheritIO().start().waitFor();
    }    
}

3

मैं x4u क्या कहा में डाल दिया है। ग्रहण इसके चारों ओर एक कोशिश पकड़ने वाला ब्लॉक चाहता था, इसलिए मैंने इसे मेरे लिए उत्पन्न किया।

try {
        System.in.read();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

यह शायद उस पर सभी प्रकार की घंटियाँ और सीटी हो सकती हैं, लेकिन मुझे लगता है कि शुरुआती लोगों के लिए एक कमांड लाइन खिड़की चाहिए जो इसे नहीं छोड़ती है जो ठीक होनी चाहिए।

इसके अलावा मुझे नहीं पता कि यह कितना आम है (यह मेरी पहली बार जार फाइलें बनाने का काम है), लेकिन यह केवल एक बैट फाइल के जरिए ही नहीं चलेगा।

java.exe -jar mylibrary.jar

ऊपर वही है जो बैट फाइल में समान फ़ोल्डर में था। एक स्थापित मुद्दा लगता है।

ग्रहण ट्यूटोरियल से आया: http://eclipsetutorial.sourceforge.net/index.html

कुछ उत्तर भी आए: ओरेकल थ्रेड


3
public static void main(String args[])
{
    Scanner s = new Scanner(System.in);

    System.out.println("Press enter to continue.....");

    s.nextLine();   
}

यह nextlineएक बहुत अच्छा विकल्प है क्योंकि यह हमें अगली पंक्ति को चलाने में मदद करेगा जब भी एंटर की दबाया जाएगा।


1

एक सरल चाल:

import java.util.Scanner;  

/* Add these codes at the end of your method ...*/

Scanner input = new Scanner(System.in);
System.out.print("Press Enter to quit...");
input.nextLine();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.