Javaで文字ごとに入力を読み取るにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/811851

  •  03-07-2019
  •  | 
  •  

質問

cスタイルの getchar()に慣れていますが、javaに匹敵するものはないようです。字句解析器を構築していますが、文字ごとに入力を読み込む必要があります。

スキャナーを使用してトークンまたは行をスキャンし、トークンを文字ごとに解析できることはわかっていますが、複数行にわたる文字列では扱いにくいようです。 Javaの入力バッファから次の文字を取得する方法はありますか、それともScannerクラスをプラグインする必要がありますか?

入力はキーボードではなくファイルです。

役に立ちましたか?

解決

Reader.read()を使用する。 -1の戻り値は、ストリームの終わりを意味します。それ以外の場合は、 char にキャストします。

このコードは、ファイル引数のリストから文字データを読み取ります。

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

上記のコードの悪い点は、システムのデフォルトの文字セットを使用していることです。可能な限り、既知のエンコードを選択します(選択があれば、Unicodeエンコードが理想的です)。詳細については、 Charset クラスをご覧ください。 (自虐的だと思うなら、この文字エンコードのガイド。)

(注意が必要なのは、補助Unicode文字です。保存するのに2つのchar値が必要なものです。 Character クラスの詳細。これはおそらく宿題には当てはまらないエッジケースです。)

他のヒント

文字エンコードの指定と入力のバッファリングに関する他の人からの推奨事項を組み合わせて、ここで私はかなり完全な答えだと思います。

読みたいファイルを表す File オブジェクトがあると仮定します:

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
}

もう1つのオプションは、文字ごとに物を読み取らないことです。ファイル全体をメモリに読み取ります。これは、文字を複数回見る必要がある場合に便利です。簡単な方法の1つは次のとおりです。

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

入力ストリームをバッファ付きリーダーにラップし、readメソッドを使用して、ストリームの終わりまで一度に1バイトずつ読み取ります。

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

私があなただったら、スキャナーを使って" .nextByte()"を使うだけです。あなたはそれをcharにキャストすることができ、あなたは良いです。

BufferedReader を使用する場合、いくつかのオプションがあります。このバッファー付きリーダーは、リーダーよりも高速なので、ラップできます。

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

これは行をchar配列に読み込みます。同様のオプションがあります。ドキュメントをご覧ください。

Java 5では、javaで文字ごとに入力文字を読み取る機会を与えるScannerメソッドである新しい機能が追加されました。

たとえば; Scannerメソッドimport java.util.Scannerを使用します。 mainメソッドの中で:define

Scanner myScanner = new Scanner(System.in); //読み取り文字用

char anything = myScanner.findInLine("。")。charAt(0);

何でも単一の文字を保存します。もっと読みたい文字があれば、anything1、anything2のようなオブジェクトを宣言します。 あなたの答えのより多くの例はあなたの手で確認してください(コピー/貼り付け)

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

   }
  }

これにより、ファイルの1行に1文字が印刷されます。

    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());
    }
scroll top