Java: System.console () 'dan girdi nasıl alınır


162

Kullanıcıdan girdi almak için Console sınıfını kullanmaya çalışıyorum ama aradığımda boş bir nesne döndürülüyor System.console(). System.console'u kullanmadan önce bir şey değiştirmem gerekir mi?

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

1
bu android için mi? (kullanıcı kimliğinizden tahmin ediyorum)
Ryan Fernandes

Programınızı başlatmak için eclipse kullanıyor musunuz? Java.exe kullanarak tutulma olmadan programınızı başlatmayı deneyin.
keuleJ

5
McDowell projesi "AbstractingTheJavaConsole" göz at: illegalargumentexception.googlecode.com/svn/trunk/code/java/...
athspk

7
@RyanFernandes İsmi sorusuyla nasıl ilgili?
b1nary.atr0phy

Yanıtlar:


238

Girişi okumak için Konsol kullanma (yalnızca IDE dışında kullanılabilir):

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

Başka bir yol (her yerde çalışır):

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 (), bir IDE içinde null değerini döndürür.
Gerçekten kullanmanız gerekiyorsa , McDowell'denSystem.console() bu çözümü okuyun .


girişi okumak için neden BufferedReader'a ihtiyacımız var? Neden doğrudan InputStreamReader'dan okuyamıyoruz
Learner

2
Yanıt var: Bir BufferedInputStream ile yöntem, 8192 baytı okuyan ve ihtiyaç duyulana kadar arabellekleyen aşırı yüklenmiş bir read () yöntemine temsilci seçer. Yine de yalnızca tek baytı döndürür (ancak diğerlerini yedek tutar). Bu şekilde BufferedInputStream, dosyadan okumak için işletim sistemine daha az yerel çağrı yapar. Teşekkürler
Öğrenci

Kullanıcıdan şifre okumak istersek, stackoverflow.com/questions/22545603/… çizgiyi yıldız işareti ile maskeler.
oraclesoon

@ Öğrenicinin bir başka nedeni, BufferedReader'ın readLine()var olmayan yöntemi sağlaması olabilir InputStreamReader.
Marcono1234

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

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

4
Ancak nextLine()çalışmak çok dağınık. En iyi ihtimalle konsoldan tüm hatları almaya çalışırken size bir baş ağrısı verecektir.
Yokhen

9
@Yokhen lütfen in.nextLine()sorun yaratabilecek bir örnek verebilir misiniz ?
ajay

2
(1) Varsayılan olarak Tarayıcı sınırlayıcısı boşluktur, bu nedenle kullanıcı birden fazla metin girdiğinde, yazılımın sonraki birkaç () öğesine ilerlemesine neden olur ve yazılımımızdaki mantık yanlış olur. (2) Boşluk ve \ n \ r dahil tüm cümleyi tam olarak okumak için nextLine () kullanırsam, () kullanıcı girişini kesmem gerekir. (3) next () kullanıcı girişini bekler, ancak nextLine () beklemez. (4) useDelimiter'i ("\\ r \\ n") test ettim, ancak yazılımımızdaki bir sonraki () mantığın tekrar yanlış olmasına neden oluyor. Sonuç olarak, kullanıcı girişini okumak için Tarayıcı kullanmak oldukça karışıktır. BufferedReader en iyisidir.
17:17, oraclesoon

Tarayıcı ile ilgili de sorunlarım var, özellikle java.util.NoSuchElementExceptiontam olarak anlamadığım bir tane alıyorum.
Romain Vincent

Bütün bunlar bir kaynaklarla deneme içinde olmalı ve bir satırı okumak istiyorsanız yöntem in.nextLine () olmalıdır.
Calabacin

35

Konsolunuzdan / klavyenizden giriş dizesini okumanın birkaç yolu vardır. Aşağıdaki örnek kod, Java kullanarak konsoldan / klavyeden bir dizenin nasıl okunacağını gösterir.

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

}
}

Kodun son bölümü java.io.Consolesınıfı kullanmıştır . System.console()Eclipse aracılığıyla demo kodunu çalıştırırken Console örneğini alamazsınız . Eclipse uygulamanızı bir sistem konsolu ile üst düzey bir işlem olarak değil, bir arka plan işlemi olarak çalıştırır.


18

Ortamınıza bağlı olacaktır. Eğer üzerinden bir Salıncak UI çalıştırıyorsanız javaw, örneğin o zaman değil görüntülemek için bir konsol. Bir IDE içinde çalışıyorsanız, büyük ölçüde belirli IDE'nin konsol IO'sunu işlemesine bağlı olacaktır.

Komut satırından olsa da, iyi olmalı. Örneklem:

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

Sadece şununla çalıştır java:

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

Başka bir seçenek de System.in, BufferedReadersatırları okumak için a'yı sarmak veya kullanmak Scanner(yeniden sarmak System.in) için kullanmak olabilir.


7

Burada konsoldan okuma ile ilgili iyi bir cevap buldum, burada başka bir yol konsoldan okumak için 'Tarayıcı' kullanın:

import java.util.Scanner;
String data;

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

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

1
close()Bu durumda tarayıcıyı aramak istemeyebilirsiniz , çünkü System.in dosyasını kapatır ve uygulamanızın daha sonra okumasını engeller. (Daha sonra okumak "satır bulunamadı" hatası
Trevor

Evet, niyet ediyorum, eğer System.in programda daha sonra kullanmaksa close () kullanılmamalıdır.
akhouri

5

Bunu dene. umarım bu yardımcı olur.

    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

Aşağıdakiler, athspk'nin cevabını alır ve kullanıcı "çıkış" yazana kadar sürekli olarak döngüye girer. Ben de bu kodu aldım ve test edilebilir yaptım bir takip cevap yazdım .

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

Örnek çıktı:

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

Bir IDE içinden bir uygulama çalıştırırken System.console () null olma sorunu ile başa çıkabilir Text-IO kütüphanesini yazdım .

McDowell tarafından önerilene benzer bir soyutlama katmanı sunuyor . System.console () null değerini döndürürse, kitaplık Swing tabanlı bir konsola geçer.

Ayrıca, Text-IO'nun bir dizi yararlı özelliği vardır:

  • çeşitli veri türleriyle okuma değerlerini destekler.
  • hassas verileri okurken girişi maskelemeye izin verir.
  • listeden bir değer seçmeye izin verir.
  • giriş değerleri (format modelleri, değer aralıkları, uzunluk kısıtlamaları vb.) üzerinde kısıtlamaların belirlenmesine izin verir.

Kullanım örneği:

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

In Bu resim Yukarıdaki kod Salıncak tabanlı bir konsol çalışan görebilirsiniz.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.