জাভা: System.console থেকে ইনপুট কীভাবে পাবেন ()


163

আমি ব্যবহারকারীর কাছ থেকে ইনপুট পেতে কনসোল ক্লাসটি ব্যবহার করার চেষ্টা করছি তবে আমি কল করলে কোনও নাল বস্তু ফিরে আসে System.console()। System.console ব্যবহার করার আগে আমাকে কি কিছু পরিবর্তন করতে হবে?

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

1
এটি কি অ্যান্ড্রয়েডের জন্য? (আমি আপনার ব্যবহারকারী আইডি থেকে অনুমান করছি)
রায়ান ফার্নান্দেস

আপনি কি আপনার প্রোগ্রামটি শুরু করতে গ্রহণ করছেন? Java.exe ব্যবহার করে গ্রহন না করে আপনার প্রোগ্রামটি শুরু করার চেষ্টা করুন।
কেউলেজে

5
: McDowell এর প্রকল্প "AbstractingTheJavaConsole" কটাক্ষপাত আছে illegalargumentexception.googlecode.com/svn/trunk/code/java/...
athspk

7
@ রায়ান ফার্নান্দেস কীভাবে তার নাম তার প্রশ্নের সাথে প্রাসঙ্গিক?
b1nary.atr0phy

উত্তর:


239

ইনপুট পড়ার জন্য কনসোল ব্যবহার করে (কেবলমাত্র একটি আইডিইর বাইরে ব্যবহারযোগ্য):

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 পরিমাণ বাইট পড়ে এবং প্রয়োজনীয় না হওয়া পর্যন্ত তাদের বাফার করে। এটি এখনও কেবল একক বাইট ফেরত দেয় (তবে অন্যদের সংরক্ষণে রাখে)। এইভাবে বাফার্ডআইপুট স্ট্রিম ফাইল থেকে পড়ার জন্য ওএসের কাছে কম দেশি কল করে। ধন্যবাদ
লার্নার

যদি আমরা ব্যবহারকারীর কাছ থেকে পাসওয়ার্ডটি পড়তে চাই তবে স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ২২৫৫60০3০ / ২ নক্ষত্রের সাথে লাইনটি মুখোশ করুন।
ওরাকলসুন

@ শিখার আরেকটি কারণ হতে পারে যে বাফারডারিডার এমন পদ্ধতি সরবরাহ করে 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) ডিফল্টরূপে স্ক্যানারের ডিলিমিটারটি স্থান হয়, সুতরাং যখন ব্যবহারকারী একাধিক পাঠ্য প্রবেশ করে, এটি সফ্টওয়্যারটিকে পরবর্তী কয়েক () পরবর্তী দিকে এগিয়ে নিয়ে যাবে এবং আমাদের সফ্টওয়্যারটির যুক্তিটি ভুল হবে। (২) আমি স্থান এবং including n \ r সহ পুরো পূর্ণ বাক্যটি পড়তে যদি নেক্সটলাইন () ব্যবহার করি তবে আমার () ব্যবহারকারীর ইনপুটটি ছাঁটাতে হবে। (3) পরবর্তী () ব্যবহারকারীর ইনপুটটির জন্য অপেক্ষা করবে তবে পরের লাইনে () তা করবে না। (৪) আমি ডেলিমিটার ("\\ r \\ n") পরীক্ষা করেছি তবে এটি আমাদের সফ্টওয়্যারটিতে পরবর্তী () যুক্তি যুক্ত করে অন্য কোথাও আবার ভুল হতে পারে। উপসংহার, ব্যবহারকারীর ইনপুট পড়ার জন্য স্ক্যানার ব্যবহার করা সত্যই যথেষ্ট অগোছালো। বাফারড্রেডার সেরা।
ওরাকলসুন

আমার স্ক্যানার নিয়েও সমস্যা আছে, উল্লেখযোগ্যভাবে আমি এমন একটি java.util.NoSuchElementExceptionপাই যা আমি বেশ বুঝতে পারি না।
রোমেন ভিনসেন্ট

এই সমস্তগুলি একটি ব্যবহারের-সংস্থানগুলির মধ্যে থাকা উচিত এবং আপনি যদি একটি লাইন পড়তে চান তবে পদ্ধতিটি ইন.এনেক্সটলাইন () হওয়া উচিত।
ক্যালাবাকিন

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()Eclipse এর মাধ্যমে ডেমো কোড চালানোর সময় থেকে আপনি কনসোল উদাহরণটি পেতে পারেন না । কারণ গ্রহন আপনার অ্যাপ্লিকেশনটিকে ব্যাকগ্রাউন্ড প্রক্রিয়া হিসাবে চালায় এবং সিস্টেম কনসোল সহ শীর্ষ-স্তরের প্রক্রিয়া হিসাবে নয়।


18

এটি আপনার পরিবেশের উপর নির্ভর করবে। javawউদাহরণস্বরূপ আপনি যদি সুইং ইউআই চালাচ্ছেন তবে তা নেই প্রদর্শন করতে একটি কনসোল। আপনি যদি কোনও আইডিই-র মধ্যে চলমান থাকেন তবে এটি আইডির কনসোলের নির্দিষ্ট আইডিইর হ্যান্ডলিংয়ের উপর নির্ভর করবে।

কমান্ড লাইন থেকে, যদিও এটি ভাল হওয়া উচিত। নমুনা:

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 ব্যবহার করার অভিপ্রায় থাকলে ক্লোজ () ব্যবহার করা উচিত নয়।
আখৌরী

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

আমি টেক্সট- IO লিখেছি গ্রন্থাগারটি , যা আইডিইর মধ্যে থেকে কোনও অ্যাপ্লিকেশন চালানোর সময় সিস্টেমকনসোল () শূন্য হওয়ার সমস্যা মোকাবেলা করতে পারে।

এটি ম্যাকডোভেল প্রস্তাবিত অনুরূপ একটি বিমূর্ত স্তর প্রবর্তন করে । যদি সিস্টেম.কনসোল () নালায় দেয়, গ্রন্থাগারটি সুইং-ভিত্তিক কনসোলটিতে স্যুইচ করে।

এছাড়াও, পাঠ্য-আইওর বিভিন্ন বৈশিষ্ট্যযুক্ত বৈশিষ্ট্য রয়েছে:

  • বিভিন্ন ডেটা ধরণের সাথে পাঠ্য মানকে সমর্থন করে।
  • সংবেদনশীল ডেটা পড়ার সময় ইনপুটটি মাস্কিংয়ের অনুমতি দেয়।
  • একটি তালিকা থেকে একটি মান নির্বাচন করার অনুমতি দেয়।
  • ইনপুট মানগুলিতে (ফর্ম্যাট নিদর্শন, মান সীমা, দৈর্ঘ্যের সীমাবদ্ধতা ইত্যাদি) সীমাবদ্ধতা নির্দিষ্ট করার অনুমতি দেয়।

ব্যবহারের উদাহরণ:

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 + ".");

ইন এই ছবিটি আপনি উপরের কোড একটি সুইং-ভিত্তিক কনসোলে চলমান দেখতে পারেন।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.