Domanda

Sono abituato al getchar () in stile c, ma sembra che non ci sia nulla di paragonabile a Java. Sto costruendo un analizzatore lessicale e ho bisogno di leggere il carattere di input per carattere.

So di poter usare lo scanner per scansionare un token o una linea e analizzare il token char-by-char, ma questo sembra ingombrante per le stringhe che si estendono su più righe. Esiste un modo per ottenere il carattere successivo dal buffer di input in Java o devo semplicemente collegarlo con la classe Scanner?

L'input è un file, non la tastiera.

È stato utile?

Soluzione

Usa Reader.read () . Un valore di ritorno di -1 indica la fine del flusso; altrimenti, esegui il cast in carattere .

Questo codice legge i dati dei caratteri da un elenco di argomenti del file:

public class CharacterHandler {
    //Java 7 source level
    public static void main(String[] args) throws IOException {
        // replace this with a known encoding if possible
        Charset encoding = Charset.defaultCharset();
        for (String filename : args) {
            File file = new File(filename);
            handleFile(file, encoding);
        }
    }

    private static void handleFile(File file, Charset encoding)
            throws IOException {
        try (InputStream in = new FileInputStream(file);
             Reader reader = new InputStreamReader(in, encoding);
             // buffer for efficiency
             Reader buffer = new BufferedReader(reader)) {
            handleCharacters(buffer);
        }
    }

    private static void handleCharacters(Reader reader)
            throws IOException {
        int r;
        while ((r = reader.read()) != -1) {
            char ch = (char) r;
            System.out.println("Do something with " + ch);
        }
    }
}

La cosa negativa del codice sopra è che utilizza il set di caratteri predefinito del sistema. Ove possibile, preferisci una codifica nota (idealmente, una codifica Unicode se hai una scelta). Vedi la Charset per ulteriori informazioni. (Se ti senti masochista, puoi leggere questa guida alla codifica dei caratteri .)

(Una cosa che potresti voler cercare sono i caratteri Unicode supplementari - quelli che richiedono due valori char per l'archiviazione. Vedi classe carattere per maggiori dettagli; questo è un caso limite che probabilmente non si applica ai compiti a casa.)

Altri suggerimenti

Combinando i consigli di altri per specificare una codifica dei caratteri e bufferizzare l'input, ecco cosa penso sia una risposta abbastanza completa.

Supponendo che tu abbia un oggetto File che rappresenta il file che vuoi leggere:

BufferedReader reader = new BufferedReader(
    new InputStreamReader(
        new FileInputStream(file),
        Charset.forName("UTF-8")));
int c;
while((c = reader.read()) != -1) {
  char character = (char) c;
  // Do something with your character
}

Un'altra opzione è quella di non leggere le cose carattere per carattere: leggere l'intero file in memoria. Questo è utile se devi guardare i personaggi più di una volta. Un modo banale per farlo è:

  /** Read the contents of a file into a string buffer      */
    public static void readFile(File file, StringBuffer buf)
        throws IOException
    {
    FileReader fr = null;
    try {
      fr = new FileReader(file);
      BufferedReader br = new BufferedReader(fr);
      char[] cbuf = new char[(int) file.length()];
      br.read(cbuf);  
      buf.append(cbuf);
      br.close();
    }
    finally {
      if (fr != null) {
        fr.close();
      }
    }
}

Avvolgere il flusso di input in un lettore con buffer, quindi utilizzare il metodo read per leggere un byte alla volta fino alla fine del flusso.

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

public class Reader {

    public static void main(String[] args) throws IOException {

        BufferedReader buffer = new BufferedReader(
                 new InputStreamReader(System.in));
        int c = 0;
        while((c = buffer.read()) != -1) {
            char character = (char) c;          
            System.out.println(character);          
        }       
    }   
}

Se fossi in te, utilizzerei semplicemente uno scanner e utilizzerei " .nextByte () " ;. Puoi lanciarlo su un personaggio e sei bravo.

Hai diverse opzioni se usi BufferedReader . Questo lettore con buffer è più veloce di Reader, quindi puoi avvolgerlo.

BufferedReader reader = new BufferedReader(new FileReader(path));
reader.read(char[] buffer);

questo legge la riga nell'array char. Hai opzioni simili. Guarda la documentazione.

Avvolgi il tuo lettore in un BufferedReader , che mantiene un buffer che consente letture molto più veloci nel complesso. Puoi quindi usare read () per leggere un singolo personaggio (che dovrai lanciare). Puoi anche usare readLine () per recuperare un'intera riga e quindi suddividerla in singoli caratteri. BufferedReader supporta anche la marcatura e la restituzione, quindi, se necessario, puoi leggere una riga più volte.

In generale, si desidera utilizzare un BufferedReader o BufferedInputStream  oltre a qualunque flusso tu stia effettivamente utilizzando poiché il buffer che gestiscono renderà più letture molto più veloci.

In java 5 è stata aggiunta una nuova funzionalità che è il metodo Scanner che dà la possibilità di leggere i caratteri di input per carattere in java.

per esempio; per l'uso Metodo scanner import java.util.Scanner; dopo nel metodo principale: define

Scanner myScanner = new Scanner (System.in); // per il carattere letto

char any = myScanner.findInLine (". "). charAt (0);

qualsiasi cosa memorizzi un singolo carattere, se vuoi saperne di più leggi più caratteri dichiara più oggetti come qualcosa1, qualcosa2 ... più esempio per la tua risposta, controlla in mano (copia / incolla)

     import java.util.Scanner;
     class ReverseWord  {

    public static void main(String args[]){
    Scanner myScanner=new Scanner(System.in);
    char c1,c2,c3,c4;

    c1 = myScanner.findInLine(".").charAt(0);
        c2 = myScanner.findInLine(".").charAt(0);
    c3 = myScanner.findInLine(".").charAt(0);
    c4 = myScanner.findInLine(".").charAt(0);

    System.out.print(c4);
    System.out.print(c3);
    System.out.print(c2);
    System.out.print(c1);
    System.out.println();

   }
  }

Verrà stampato 1 carattere per riga dal file.

    try {

        FileInputStream inputStream = new FileInputStream(theFile);
        while (inputStream.available() > 0) {
            inputData = inputStream.read();
            System.out.println((char) inputData);

        }
        inputStream.close();
    } catch (IOException ioe) {
        System.out.println("Trouble reading from the file: " + ioe.getMessage());
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top