如何在Java中按字符读取输入?
我习惯了c样式getchar(),但似乎没有可比的Java。 我正在构建一个词法分析器,我需要逐个字符读取输入内容。
我知道我可以使用扫描仪扫描令牌或行并逐个字符地解析令牌,但是对于跨越多行的字符串来说似乎很难。 有没有一种方法可以从Java中的输入缓冲区中获取下一个字符,还是应该随身携带Scanner类?
输入是文件,而不是键盘。
9个解决方案
58 votes
使用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字符-需要存储两个char值的Unicode字符。有关更多详细信息,请参见Character类;这是一种边缘情况,可能不适用于家庭作业。)
McDowell answered 2020-07-02T01:22:42Z
15 votes
结合其他人的建议来指定字符编码和缓冲输入,这是我认为的很完整的答案。
假设您有一个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
}
roryparle answered 2020-07-02T01:23:07Z
6 votes
另一个选择是不逐字符读取内容-将整个文件读取到内存中。 如果您需要多次查看字符,这将很有用。 一种简单的方法是:
/** 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();
}
}
}
David answered 2020-07-02T01:23:27Z
6 votes
将输入流包装在缓冲的读取器中,然后使用read方法一次读取一个字节,直到流结束。
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);
}
}
}
pfranza answered 2020-07-02T01:23:47Z
2 votes
如果我是你,我只会使用扫描仪并使用“ .nextByte()”。 您可以将其转换为字符,这很好。
W. B. Reed answered 2020-07-02T01:24:07Z
1 votes
如果使用BufferedReader,则有几种选择。此缓冲的读取器比Reader快,因此可以包装它。
BufferedReader reader = new BufferedReader(new FileReader(path));
reader.read(char[] buffer);
这会将行读入char数组。 您有类似的选择。 查看文档。
shake answered 2020-07-02T01:24:31Z
1 votes
将您的阅读器包装在BufferedReader中,该BufferedReader维护一个缓冲区,以允许整体上更快地读取。 然后,您可以使用read()来读取单个字符(需要强制转换)。 您还可以使用readLine()提取整行,然后将其分成单个字符。 BufferedReader还支持标记和返回,因此,如果需要,您可以读取一行。
一般来说,您要使用BufferedReader或BufferedInputStream 在您实际使用的任何流之上,因为它们维护的缓冲区将使多次读取快得多。
James answered 2020-07-02T01:24:56Z
0 votes
在Java 5中增加了一个新功能,即Scanner方法,该功能使您有机会逐个读取Java中的字符。
例如;使用Scanner方法import java.util.Scanner;在主要方法之后:定义
扫描仪myScanner = new Scanner(System.in);//用于读取字符
char something = 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();
}
}
samir vora answered 2020-07-02T01:25:34Z
-1 votes
这将从文件中每行打印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());
}
grant zukowski answered 2020-07-02T01:25:54Z