56

私は c-style に慣れていますgetchar()が、Java に匹敵するものはないようです。字句解析器を作成していますが、入力を 1 文字ずつ読み込む必要があります。

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

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

4

9 に答える 9

64

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クラスを参照してください。これは、おそらく宿題には当てはまらない特殊なケースです。)

于 2009-05-01T15:25:10.387 に答える
8

もう 1 つのオプションは、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();
      }
    }
}
于 2009-05-01T18:32:35.257 に答える
7

バッファリングされたリーダーで入力ストリームをラップし、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);          
        }       
    }   
}
于 2009-05-01T16:00:53.547 に答える
1

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

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

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

于 2009-05-01T15:30:08.457 に答える
1

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

于 2012-08-13T00:42:42.140 に答える
1

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

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

于 2009-05-01T15:38:55.627 に答える
0

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

例えば; 使用する Scanner メソッド import java.util.Scanner; メインメソッドの後:定義

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

char 何でも = myScanner.findInLine(".").charAt(0);

あなたは何でも単一の文字を保存します。もっと読みたい場合は、もっと文字を宣言します

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

   }
  }
于 2012-01-21T11:05:03.910 に答える