私は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 クラスを参照してください。 (自虐的だと感じるなら、 この文字エンコーディングのガイド を読むことができます)
(あなたが探したいかもしれないものの1つは、補助的な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つは次のとおりです。
/** 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配列に読み込みます。同様のオプションがあります。ドキュメントを見てください。
リーダーを BufferedReader でラップします。これにより、バッファーが維持され、読み取り全体が大幅に高速化されます。その後、read()を使用して、1つの文字(キャストする必要があります)を読み取ることができます。 readLine()を使用して行全体をフェッチし、それを個々の文字に分割することもできます。 BufferedReaderは、マーキングとリターンもサポートしているため、必要に応じて1行を複数回読み取ることができます。
一般的に言って、実際に使用しているストリームの上にBufferedReaderまたはBufferedInputStreamを使用したいのは、それらが保持するバッファーによって複数の読み取りがはるかに高速になるためです。
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();
}
}