जावा: System.console () से इनपुट कैसे प्राप्त करें


162

मैं उपयोगकर्ता से इनपुट प्राप्त करने के लिए कंसोल क्लास का उपयोग करने की कोशिश कर रहा हूं, लेकिन जब मैं कॉल करता हूं तो एक अशक्त वस्तु वापस आ जाती है System.console()। क्या मुझे System.console का उपयोग करने से पहले कुछ भी बदलना होगा?

Console co=System.console();
System.out.println(co);
try{
    String s=co.readLine();
}

1
यह Android के लिए है? (मैं अपनी यूजर आईडी से अनुमान लगा रहा हूं)
रयान फर्नांडिस

क्या आप अपना कार्यक्रम शुरू करने के लिए ग्रहण का उपयोग कर रहे हैं? Java.exe का उपयोग करके ग्रहण के बिना अपना कार्यक्रम शुरू करने का प्रयास करें।
keuleJ

5
McDowell की परियोजना "AbstractingTheJavaConsole" पर एक नज़र डालें: गैरकानूनी रंग
परिवर्तन

7
@RyanFernandes उनका नाम उनके प्रश्न के लिए कैसे प्रासंगिक है?
b1nary.atr0phy

जवाबों:


238

इनपुट पढ़ने के लिए कंसोल का उपयोग करना (केवल एक आईडीई के बाहर प्रयोग करने योग्य):

System.out.print("Enter something:");
String input = System.console().readLine();

एक और तरीका (हर जगह काम करता है):

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {
    public static void main(String[] args) throws IOException { 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("Enter String");
        String s = br.readLine();
        System.out.print("Enter Integer:");
        try {
            int i = Integer.parseInt(br.readLine());
        } catch(NumberFormatException nfe) {
            System.err.println("Invalid Format!");
        }
    }
}

System.console () एक IDE में अशक्त देता है।
इसलिए यदि आपको वास्तव में उपयोग करने की आवश्यकता है System.console(), तो मैकडॉवेल के इस समाधान को पढ़ें ।


हमें इनपुट पढ़ने के लिए बफेदरएयर की आवश्यकता क्यों है क्योंकि हम सीधे इनपुटस्ट्रीमर से नहीं पढ़ सकते हैं
शिक्षार्थी

2
जवाब मिला: एक बफ़रड इनपुटस्ट्रीम के साथ, विधि एक ओवरलोडेड रीड () विधि को दर्शाती है जो 8192 बाइट्स की मात्रा को पढ़ती है और जब तक उन्हें ज़रूरत होती है तब तक बफ़र करती है। यह अभी भी केवल एकल बाइट देता है (लेकिन अन्य को आरक्षित रखता है)। इस तरह से BufferedInputStream OS पर फ़ाइल से पढ़ने के लिए कम देशी कॉल करता है। धन्यवाद
शिक्षार्थी

मामले में हम उपयोगकर्ता से पासवर्ड पढ़ना चाहते हैं, stackoverflow.com/questions/22545603/… तारांकन चिह्न के साथ लाइन मास्क करता है।
oraclesoon

@ Learner एक और कारण हो सकता है कि BufferedReader वह विधि प्रदान करता है readLine()जो इसके लिए मौजूद नहीं है InputStreamReader
Marcono1234

116
Scanner in = new Scanner(System.in);

int i = in.nextInt();
String s = in.next();

4
हालांकि nextLine()साथ काम करने के लिए बहुत गड़बड़ है। कम से कम यह आपको सिरदर्द देगा जब आप कंसोल से पूरी लाइनें प्राप्त करने की कोशिश करेंगे।
योकेन

9
@ योकेन आप एक उदाहरण दे सकते हैं जहां in.nextLine()समस्याएं पैदा करेगा?
अजय

2
(1) डिफ़ॉल्ट रूप से स्केनर का परिसीमन स्थान है, इसलिए जब उपयोगकर्ता कई ग्रंथों में प्रवेश करता है, तो यह सॉफ्टवेयर को अगले कुछ के लिए आगे बढ़ाएगा () और हमारे सॉफ्टवेयर में तर्क गलत होगा। (2) यदि मैं अगले पूर्ण वाक्य () का उपयोग करता हूं, तो पूरा पूरा वाक्य पढ़ने के लिए जिसमें स्पेस और \ n \ r शामिल हैं, मुझे उपयोगकर्ता इनपुट ट्रिम () करने की आवश्यकता है। (3) अगला () उपयोगकर्ता इनपुट के लिए इंतजार करेगा लेकिन अगली लाइन () नहीं होगी। (4) मैंने यूज किया डिल्डिमिटर ("\\ r \\ n"), लेकिन यह हमारे सॉफ़्टवेयर में अगले () लॉजिक के कारण कहीं और फिर से गलत होने का कारण बनता है। निष्कर्ष, उपयोगकर्ता इनपुट को पढ़ने के लिए स्कैनर का उपयोग करना वास्तव में काफी गड़बड़ है। बफ़रड्रेडर सबसे अच्छा है।
oraclesoon

मुझे स्कैनर की भी समस्या है, विशेष रूप से मुझे ऐसा लगता है java.util.NoSuchElementExceptionकि मुझे बिल्कुल समझ नहीं है
रोमेन विंसेंट

यह सब एक कोशिश के साथ-संसाधनों के अंदर होना चाहिए और यदि आप एक पंक्ति पढ़ना चाहते हैं, तो विधि in.nextLine () होनी चाहिए।
कैलाबासिन

35

आपके कंसोल / कीबोर्ड से इनपुट स्ट्रिंग को पढ़ने के कुछ तरीके हैं। निम्नलिखित नमूना कोड दिखाता है कि जावा का उपयोग करके कंसोल / कीबोर्ड से एक स्ट्रिंग कैसे पढ़ें।

public class ConsoleReadingDemo {

public static void main(String[] args) {

    // ====
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    System.out.print("Please enter user name : ");
    String username = null;
    try {
        username = reader.readLine();
    } catch (IOException e) {
        e.printStackTrace();
    }
    System.out.println("You entered : " + username);

    // ===== In Java 5, Java.util,Scanner is used for this purpose.
    Scanner in = new Scanner(System.in);
    System.out.print("Please enter user name : ");
    username = in.nextLine();      
    System.out.println("You entered : " + username);


    // ====== Java 6
    Console console = System.console();
    username = console.readLine("Please enter user name : ");   
    System.out.println("You entered : " + username);

}
}

कोड का अंतिम भाग java.io.Consoleकक्षा का उपयोग करता है। System.console()ग्रहण के माध्यम से डेमो कोड चलाने पर आपको कंसोल कंसोल नहीं मिल सकता है । क्योंकि ग्रहण आपके एप्लिकेशन को एक पृष्ठभूमि प्रक्रिया के रूप में चलाता है न कि सिस्टम कंसोल के साथ एक शीर्ष-स्तरीय प्रक्रिया के रूप में।


18

यह आपके पर्यावरण पर निर्भर करेगा। यदि आप javawउदाहरण के लिए एक स्विंग यूआई चला रहे हैं , तो प्रदर्शित करने के लिए कोई कंसोल नहीं है। यदि आप एक IDE के भीतर चल रहे हैं, तो यह बहुत विशिष्ट IDE के कंसोल IO के हैंडलिंग पर निर्भर करेगा।

कमांड लाइन से, यह ठीक होना चाहिए। नमूना:

import java.io.Console;

public class Test {

    public static void main(String[] args) throws Exception {
        Console console = System.console();
        if (console == null) {
            System.out.println("Unable to fetch console");
            return;
        }
        String line = console.readLine();
        console.printf("I saw this line: %s", line);
    }
}

इसे बस के साथ चलाएं java:

> javac Test.java
> java Test
Foo  <---- entered by the user
I saw this line: Foo    <---- program output

एक अन्य विकल्प का उपयोग करना है System.in, जिसे आप BufferedReaderपढ़ने की पंक्तियों में लपेटना चाहते हैं, या Scannerफिर (फिर से लपेटना System.in) का उपयोग कर सकते हैं ।


7

कंसोल से पढ़ने के संबंध में यहाँ कुछ अच्छा जवाब मिला, यहाँ एक और तरीका है कंसोल से पढ़ने के लिए 'स्कैनर' का उपयोग करें:

import java.util.Scanner;
String data;

Scanner scanInput = new Scanner(System.in);
data= scanInput.nextLine();

scanInput.close();            
System.out.println(data);

1
आप close()इस मामले में स्कैनर को कॉल नहीं करना चाह सकते हैं , क्योंकि यह System.in को बंद कर देगा और आपके आवेदन को बाद में पढ़ने से रोकेगा। (पढ़ना बाद में त्रुटि "कोई लाइन नहीं मिली" फेंकता है)
ट्रेवर

हां, मैं इस बात से सहमत हूं, यदि कार्यक्रम में बाद में System.in का उपयोग करने का इरादा है तो बंद () का उपयोग नहीं किया जाना चाहिए।
1

5

इसे इस्तेमाल करे। आशा है कि यह मदद करेगा।

    String cls0;
    String cls1;

    Scanner in = new Scanner(System.in);  
    System.out.println("Enter a string");  
    cls0 = in.nextLine();  

    System.out.println("Enter a string");  
    cls1 = in.nextLine(); 

3

निम्नलिखित एथलीट का जवाब लेता है और इसे एक में बनाता है जो उपयोगकर्ता के "बाहर निकलने" तक लगातार लूप करता है। मैंने एक फॉलोअप उत्तर भी लिखा है जहाँ मैंने यह कोड लिया है और इसे परीक्षण योग्य बनाया है।

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class LoopingConsoleInputExample {

   public static final String EXIT_COMMAND = "exit";

   public static void main(final String[] args) throws IOException {
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      System.out.println("Enter some text, or '" + EXIT_COMMAND + "' to quit");

      while (true) {

         System.out.print("> ");
         String input = br.readLine();
         System.out.println(input);

         if (input.length() == EXIT_COMMAND.length() && input.toLowerCase().equals(EXIT_COMMAND)) {
            System.out.println("Exiting.");
            return;
         }

         System.out.println("...response goes here...");
      }
   }
}

उदाहरण आउटपुट:

Enter some text, or 'exit' to quit
> one
one
...response goes here...
> two
two
...response goes here...
> three
three
...response goes here...
> exit
exit
Exiting.

3

मैंने टेक्स्ट-आईओ लिखा है लाइब्रेरी , जो एक IDE के भीतर से एप्लिकेशन चलाते समय System.console () के अशक्त होने की समस्या से निपट सकता है।

यह मैकडॉवेल द्वारा प्रस्तावित एक के समान एक अमूर्त परत का परिचय देता है । यदि System.console () रिक्त हो जाता है, तो लाइब्रेरी स्विंग-आधारित कंसोल पर स्विच हो जाती है।

इसके अलावा, टेक्स्ट-आईओ में कई उपयोगी विशेषताएं हैं:

  • विभिन्न डेटा प्रकारों के साथ पढ़ने के मूल्यों का समर्थन करता है।
  • संवेदनशील डेटा पढ़ते समय इनपुट मास्किंग की अनुमति देता है।
  • एक सूची से एक मूल्य का चयन करने की अनुमति देता है।
  • इनपुट मूल्यों (प्रारूप पैटर्न, मूल्य सीमा, लंबाई की कमी आदि) पर बाधाओं को निर्दिष्ट करने की अनुमति देता है।

उपयोग उदाहरण:

TextIO textIO = TextIoFactory.getTextIO();

String user = textIO.newStringInputReader()
        .withDefaultValue("admin")
        .read("Username");

String password = textIO.newStringInputReader()
        .withMinLength(6)
        .withInputMasking(true)
        .read("Password");

int age = textIO.newIntInputReader()
        .withMinVal(13)
        .read("Age");

Month month = textIO.newEnumInputReader(Month.class)
        .read("What month were you born in?");

textIO.getTextTerminal().println("User " + user + " is " + age + " years old, " +
        "was born in " + month + " and has the password " + password + ".");

में इस छवि को आप ऊपर कोड एक स्विंग-आधारित कंसोल में चल देख सकते हैं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.