web-dev-qa-db-ja.com

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

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

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

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

46
jergason

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 クラスを参照してください。 (自虐的だと感じるなら、 この文字エンコーディングのガイド を読むことができます)

(あなたが探したいかもしれないものの1つは、補助的なUnicode文字です-保存するために2つのchar値を必要とするものです。詳細については、 Character クラスを参照してください;これはおそらく宿題には当てはまらないエッジケース。

57
McDowell

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

読みたいファイルを表す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
}
15
roryparle

別のオプションは、文字ごとに物を読み取らないことです。ファイル全体をメモリに読み取ります。これは、文字を複数回見る必要がある場合に便利です。簡単な方法の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();
      }
    }
}
6
David

入力ストリームをバッファ付きリーダーにラップし、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);          
        }       
    }   
}
6
pfranza

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

2
W. B. Reed

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

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

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

1
shake

リーダーを BufferedReader でラップします。これにより、バッファーが維持され、読み取り全体が大幅に高速化されます。その後、read()を使用して、1つの文字(キャストする必要があります)を読み取ることができます。 readLine()を使用して行全体をフェッチし、それを個々の文字に分割することもできます。 BufferedReaderは、マーキングとリターンもサポートしているため、必要に応じて1行を複数回読み取ることができます。

一般的に言って、実際に使用しているストリームの上にBufferedReaderまたはBufferedInputStreamを使用したいのは、それらが保持するバッファーによって複数の読み取りがはるかに高速になるためです。

1
James

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

例えば; Scannerメソッドを使用するには、Java.util.Scannerをインポートします。 mainメソッドの後:定義

スキャナーmyScanner = new Scanner(System.in); //読み取り文字用

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

あなたは何でも単一の文字を保存します、もっと読みたい場合は、何か1、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();

   }
  }
0
samir vora