2013-03-16 7 views
8

Qual è l'uso di System.in.read() in java?
Si prega di spiegare questo.Qual è l'uso di System.in.read()?

+0

http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html #read() Legge un valore in byte di dati dal flusso di input. – Sanchit

+0

vedere qui http://www.coderanch.com/t/278751//java/system-read-method – PSR

+0

semplice è usato per ottenere l'input dall'utente. Google prima di chiedere qui. – Ameer

risposta

19

Questo esempio può essere d'aiuto.

import java.io.IOException; 

public class MainClass { 

    public static void main(String[] args) { 
     int inChar; 
     System.out.println("Enter a Character:"); 
     try { 
      inChar = System.in.read(); 
      System.out.print("You entered "); 
      System.out.println(inChar); 
     } 
     catch (IOException e){ 
      System.out.println("Error reading from user"); 
     } 
    } 
} 
+1

Non restituisco valori corretti: ad esempio quando inserisco 10 restituisce 49. – SaidbakR

+4

Questo perché il valore ASCII di '1' è 49. Funzionerebbe come previsto se 'int inChar' è stato modificato in' char inChar'. –

1

System.in.read() letture dallo standard input.

L'input standard può essere utilizzato per ottenere input dall'utente in un ambiente di console ma, poiché tale interfaccia utente non ha funzioni di modifica, l'uso interattivo di input standard è limitato ai corsi che insegnano la programmazione.

La maggior parte dell'utilizzo di standard di produzione è in programmi progettati per funzionare all'interno della riga di comando Unix pipelines. In tali programmi il carico utile che il programma sta elaborando proviene dallo standard input e il risultato del programma viene scritto nell'output standard. In tal caso, l'input standard non viene mai scritto direttamente dall'utente, è l'output reindirizzato di un altro programma o il contenuto di un file.

Una pipeline tipico assomiglia a questo:

# list files and directories ordered by increasing size 
du -s * | sort -n 

sort legge i dati dallo standard input, che è in realtà il risultato del comando du. I dati ordinati vengono scritti nell'output standard di sort, che termina sulla console per impostazione predefinita e può essere facilmente reindirizzato a un file o a un altro comando.

Come tale, l'input standard è usato raramente in Java.

0

Consente di leggere dallo standard input (principalmente, la console). This SO question potrebbe esserti utile.

4

System è una classe finale in java.lang pacchetto

codice di esempio dal codice sorgente di api

public final class System { 

    /** 
    * The "standard" input stream. This stream is already 
    * open and ready to supply input data. Typically this stream 
    * corresponds to keyboard input or another input source specified by 
    * the host environment or user. 
    */ 
    public final static InputStream in = nullInputStream(); 

} 

read() è un metodo astratto di classe astratta InputStream

/** 
    * Reads the next byte of data from the input stream. The value byte is 
    * returned as an <code>int</code> in the range <code>0</code> to 
    * <code>255</code>. If no byte is available because the end of the stream 
    * has been reached, the value <code>-1</code> is returned. This method 
    * blocks until input data is available, the end of the stream is detected, 
    * or an exception is thrown. 
    * 
    * <p> A subclass must provide an implementation of this method. 
    * 
    * @return  the next byte of data, or <code>-1</code> if the end of the 
    *    stream is reached. 
    * @exception IOException if an I/O error occurs. 
    */ 
    public abstract int read() throws IOException; 

In breve da the api:

Legge un numero di byte dal flusso di input e li memorizza in l'array di buffer b. Il numero di byte effettivamente letti viene restituito come un numero intero. Questo metodo blocca fino a quando i dati di input non sono disponibili, viene rilevata la fine del file o viene generata un'eccezione.

da InputStream.html#read()

0

System.in.read() è un metodo di input di lettura per la classe System.in che è "Standard Input File" o 0 in OS convenzionale.

0

Questo esempio dovrebbe aiutare?Insieme con i commenti, naturalmente> :)

ATTENZIONE: L'UOMO è una parola abusata FREQUENTE IN QUESTO PUNTO/POST

Nel complesso mi consiglia di utilizzare la classe Scanner dato che è possibile ingresso di grandi frasi, non sono del tutto certo System.in.read ha tali aspetti. Se possibile, correggimi.

public class InputApp { 

// Don't worry, passing in args in the main method as one of the arguments isn't required MAN 

    public static void main(String[] argumentalManWithAManDisorder){ 
     char inputManAger; 

     System.out.println("Input Some Crap Man: "); 
     try{ 
      // If you forget to cast char you will FAIL YOUR TASK MAN 
      inputManAger = (char) System.in.read(); 
      System.out.print("You entererd " + inputManAger + " MAN"); 
     } 
     catch(Exception e){ 
      System.out.println("ELEMENTARY SCHOOL MAN"); 
     } 
    } 
} 
+0

Questo ... questo è veramente male. – MavericksFoundation

16

Due anni e mezzo di ritardo è meglio che mai, giusto?

int System.in.read() legge il byte successivo di dati dal flusso di input. Ma sono sicuro che lo sapevi già, perché è banale da cercare. Quindi, ciò che si sta probabilmente chiedendo è:

  • Perché è dichiarata per restituire un int quando la documentazione dice che legge un byte?

  • e perché sembra restituire la spazzatura? (Tipo I '9', ma restituisce 57.)

restituisce un int perché oltre tutti i possibili valori di un byte, deve anche essere in grado di restituire un valore aggiunto per indicare fine -stream. Quindi, deve restituire un tipo che può esprimere più valori di una lattina byte.

Nota: Si potrebbe aver fatto un short, ma hanno optato per int invece, probabilmente come punta del cappello del significato storico di C, la cui getc() funzione restituisce anche un int, ma ancora più importante perché short è un un po 'scomodo da utilizzare (il linguaggio non offre alcun mezzo per specificare un valore letterale short, quindi è necessario specificare un valore letterale int e convertirlo in short,) più su alcune architetture int ha prestazioni migliori di short.

sembra tornare spazzatura perché quando si visualizza un personaggio come un intero, ciò che si sta guardando è l'ASCII (*) valore di tale carattere. Quindi, un '9' appare come un 57. Ma se lo lanci su un personaggio, ottieni '9', quindi tutto va bene.

Pensare in questo modo: se si digita il carattere '9' non ha senso aspettarsi System.in.read() per restituire il numero 9, perché allora quale numero ci si può aspettare per tornare se si fosse digitato un 'a'? Ovviamente, i personaggi devono essere mappati ai numeri. ASCII (*) è un sistema di mappatura dei caratteri ai numeri. E in questo sistema, il carattere '9' esegue la mappatura al numero 57, non il numero 9.

(*) Non necessariamente ASCII; potrebbe essere un'altra codifica, come UTF-16; ma nella stragrande maggioranza delle codifiche, e certamente in tutte le codifiche popolari, i primi 127 valori sono gli stessi di ASCII. E questo include tutti i caratteri alfanumerici inglesi e simboli popolari.

+0

Valore non ASCII; Unità di codice UTF-16. "9" -> 57. "[] (http://www.fileformat.info/info/unicode/char/1d400/index.htm)" -> [55349, 56320] –

+0

@TomBlodget Non penso che restituirà un codice UTF-16 . Visualizza il flusso di input come un flusso di byte, quindi restituirà un singolo byte. Se il flusso sembra essere un flusso di caratteri UTF-16 (ad esempio little endian), restituirà comunque byte, prima il byte basso di un carattere UTF-16, quindi il byte alto, quindi il byte basso del prossimo personaggio, e così via. Certo, potrei sbagliarmi. E non l'ho verificato Ma sei sicuro? –

+0

Hai ragione. I valori sono dalla codifica della console. Sto solo sottolineando che la codifica della console non è probabile che sia ASCII. –

1

Proprio per integrare la risposta accettata, si potrebbe anche usare System.out.read() come questo:

class Example { 
    public static void main(String args[]) 
     throws java.io.IOException { // This works! No need to use try{// ...}catch(IOException ex){// ...}   

     System.out.println("Type a letter: "); 
     char letter = (char) System.in.read(); 
     System.out.println("You typed the letter " + letter); 
    } 
} 
+0

Questo non fornisce una risposta alla domanda. Una volta che hai [reputazione] sufficiente (https://stackoverflow.com/help/whats-reputation) sarai in grado di [commentare qualsiasi post] (https://stackoverflow.com/help/privileges/comment); invece [fornisci risposte che non richiedono chiarimenti da parte del richiedente] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-, invece). - [Dalla recensione] (/ recensione/post di bassa qualità/18720909) –

+0

intendevi 'System.in.read()', giusto? –

+0

@GillesGouaillardet In realtà, questa non è meno una risposta rispetto alla risposta accettata, il problema è che la domanda non è davvero una domanda. – Vitruvius