Question

Je suis habitué au c-style getchar () , mais il semble qu'il n'y ait rien de comparable pour java. Je construis un analyseur lexical et je dois lire l'entrée par caractère.

Je sais que je peux utiliser le scanner pour numériser un jeton ou une ligne et analyser le jeton caractère par caractère, mais cela semble difficile à manier pour des chaînes couvrant plusieurs lignes. Existe-t-il un moyen d’obtenir le caractère suivant dans la mémoire tampon d’entrée en Java ou dois-je simplement me déconnecter avec la classe Scanner?

L'entrée est un fichier, pas le clavier.

Était-ce utile?

La solution

Utilisez Reader.read () . Une valeur de retour de -1 signifie la fin du flux; sinon, lancez sur char .

Ce code lit les données de caractères dans une liste d'arguments de fichiers:

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 mauvaise chose à propos du code ci-dessus est qu’il utilise le jeu de caractères par défaut du système. Dans la mesure du possible, préférez un codage connu (idéalement, un codage Unicode si vous avez le choix). Consultez la classe Jeu de caractères pour en savoir plus. (Si vous vous sentez masochiste, vous pouvez lire ce guide sur le codage de caractères .)

(Vous voudrez peut-être rechercher des caractères Unicode supplémentaires, ceux qui nécessitent le stockage de deux valeurs char. Voir Caractère pour plus de détails; il s'agit d'un cas particulier qui ne s'appliquera probablement pas aux devoirs.)

Autres conseils

En combinant les recommandations d'autres utilisateurs pour spécifier un codage de caractères et mettre en mémoire tampon l'entrée, voici ce que je pense être une réponse plutôt complète.

En supposant que vous ayez un objet Fichier représentant le fichier à lire:

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
}

Une autre option consiste à ne pas lire les choses caractère par caractère. Lire tout le fichier en mémoire. Ceci est utile si vous devez regarder les personnages plus d'une fois. Une façon triviale de le faire est:

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

Emballez votre flux d’entrée dans un lecteur mis en tampon, puis utilisez la méthode read pour lire un octet à la fois jusqu’à la fin du flux.

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

Si j'étais vous, j'utiliserais simplement un scanner et utiliser ".nextByte ()". Vous pouvez attribuer cela à un personnage et vous êtes bon.

Si vous utilisez BufferedReader , vous avez plusieurs options. Ce lecteur tamponné est plus rapide que Reader, vous pouvez donc l’emballer.

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

ceci lit la ligne dans le tableau de caractères. Vous avez des options similaires. Regardez la documentation.

Enveloppez votre lecteur dans un BufferedReader , qui maintient une mémoire tampon permettant des lectures beaucoup plus rapides. Vous pouvez ensuite utiliser read () pour lire un seul caractère (que vous devrez transtyper). Vous pouvez également utiliser readLine () pour extraire une ligne entière, puis la scinder en caractères individuels. BufferedReader prend également en charge le marquage et le renvoi. Vous pouvez donc lire une ligne plusieurs fois si nécessaire.

De manière générale, vous souhaitez utiliser BufferedReader ou BufferedInputStream.  Au-dessus du flux que vous utilisez réellement, car le tampon qu’ils gèrent rendra les lectures multiples beaucoup plus rapides.

Dans Java 5, une nouvelle fonctionnalité est ajoutée, à savoir la méthode Scanner, qui donne la possibilité de lire les caractères saisis en java.

par exemple; pour utiliser la méthode du scanner import java.util.Scanner; after dans la méthode principale: define

Scanner myScanner = new Scanner (System.in); // pour le caractère lu

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

vous stockez n'importe quel caractère, si vous voulez en savoir plus, déclarez plus d'objet comme rien1, rien2 ... plus d’exemples pour votre réponse, veuillez vérifier dans votre main (copier / coller)

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

   }
  }

Ceci imprimera 1 caractère par ligne du fichier.

    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());
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top