Frage

Ich bin auf den c-Stil getchar() verwendet, aber es scheint, als gäbe es nichts Vergleichbares für Java ist. Ich baue eine lexikalische Analyse, und ich brauche im Eingabe Zeichen für Zeichen zu lesen.

Ich weiß, dass ich den Scanner verwenden kann, in einem Token oder Zeile und analysiere durch die Token char-by-char zu scannen, aber das scheint unhandlich für Strings über mehrere Zeilen. Gibt es eine Möglichkeit, nur das nächste Zeichen aus dem Eingangspuffer in Java zu bekommen, oder soll ich einfach mit der Scanner-Klasse steckt weg?

Die Eingabe ist eine Datei, nicht die Tastatur.

War es hilfreich?

Lösung

Verwenden Sie Reader.read () . Ein Rückgabewert von -1 bedeutet Ende des Stroms; sonst, zu gieße char .

Dieser Code liest Zeichendaten aus einer Liste von Dateiargumenten:

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

Das Schlimme an den obigen Code ist, dass sie das System des Standardzeichensatz verwendet. Wo immer möglich, bevorzugt eine bekannte Codierung (im Idealfall, eine Unicode-Codierung, wenn Sie die Wahl haben). Sehen Sie die Charset Klasse für mehr. (Wenn Sie masochistisch fühlen, können Sie a href lesen <= "http://illegalargumentexception.blogspot.com/2009/05/java-rough-guide-to-character-encoding.html" rel = "noreferrer" > dieser Leitfaden zur Zeichencodierung .)

(Eine Sache, die Sie wollen, könnte eine Ergänzung achten Unicode-Zeichen sind -. Diejenigen, die zwei char Werte zu speichern benötigen finden Sie in der

Andere Tipps

die Empfehlungen von anderer Kombination einer Zeichencodierung für die Angabe und den Eingangs Pufferung, hier ist was ich denke, eine ziemlich vollständige Antwort ist.

Angenommen, Sie ein File Objekt haben, die die Datei, die Sie lesen möchten:

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
}

Eine andere Möglichkeit ist es, die Dinge nicht in zeichenweise zu lesen - die gesamte Datei in den Speicher gelesen. Dies ist nützlich, wenn man sich die Zeichen suchen muß mehr als einmal. Eine triviale Weise zu tun, ist:

  /** 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();
      }
    }
}

Wickeln Sie Ihren Eingabestrom in einem gepufferten Leser dann die Lesemethode verwendet ein Byte zu einem Zeitpunkt, bis zum Ende des Stream zu lesen.

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

Wenn ich Sie wäre, würde ich nur einen Scanner verwenden und „.nextByte ()“. Sie können, dass auf ein char geworfen und du bist gut.

Sie haben mehrere Möglichkeiten, wenn Sie BufferedReader verwenden. Diese gepufferte Leser ist schneller als Reader, damit Sie es wickeln kann.

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

Dieses liest Zeile in char-Array. Sie haben ähnliche Optionen. Schauen Sie sich Dokumentation.

Wickeln Sie Ihre Leser in einem BufferedReader , die behauptet, einen Puffer ermöglicht eine wesentlich schnellere Gesamt liest. Sie können dann lesen () verwenden, um ein einzelnes Zeichen zu lesen (was Sie werfen müssen). Sie können auch readline () verwenden, um eine ganze Zeile zu holen und dann, dass in einzelne Zeichen zu brechen. Die BufferedReader unterstützt auch markieren und dorthin zurückkehren, so dass, wenn es nötig ist, können Sie eine Linie mehrmals gelesen werden.

Im Allgemeinen möchten Sie einen BufferedReader oder BufferedInputStream verwenden  oben auf was auch immer Strom verwenden Sie eigentlich, da der Puffer sie beibehalten werden mehrere liest viel schneller machen.

In Java 5 neue Funktion hinzugefügt, dass ist Scanner-Methode, die die Möglichkeit gibt, Eingabe Zeichen für Zeichen in Java zu lesen.

zum Beispiel; Verfahren zur Verwendung Scanner import java.util.Scanner; Nach dem Hauptverfahren: definieren

Scanner myScanner = new Scanner (System.in); // für Lesezeichen

char etwas = myScanner.findInLine ( "") charAt (0).

alles, was Sie einzelne Zeichen speichern, wenn Sie mehr mehr Charakter erklären wie anything1 mehr Objekt lesen möchten, anything2 ... weiteres Beispiel für Ihre Antwort bitte in der Hand überprüfen (copy / paste)

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

   }
  }

Dies wird 1 Zeichen pro Zeile aus der Datei drucken.

    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());
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top