如何在Java中逐字读取input?

我习惯了c样式的getchar() ,但是好像没有什么可比的java。 我正在build立一个词法分析器,我需要逐字读入input字符。

我知道我可以使用扫描器来扫描令牌或行,并通过字符来parsingchar-by-char,但是对于跨越多行的string来说似乎很难使用。 有没有办法只是从Java的input缓冲区中获得下一个字符,或者我应该插上扫描仪类?

input是一个文件,而不是键盘。

使用Reader.read() 。 返回值-1表示stream的结束; 否则,投到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); } } } 

上述代码的坏处是它使用系统的默认字符集。 只要有可能,就select一个已知的编码(理想情况下,如果您有select,则使用Unicode编码)。 请参阅Charset类以获取更多信息。 (如果你感到自虐,你可以阅读本指南字符编码 。)

(你可能要注意的一点是补充的Unicode字符 – 那些需要存储两个char值的字符 。详情请参阅Character类;这是一个可能不适用于作业的边缘情况。

结合其他人的build议,指定一个字符编码和缓冲input,这是我认为是一个相当完整的答案。

假设你有一个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 } 

另一种select是不按字符读取事物 – 将整个文件读入内存。 如果您需要多次查看字符,这非常有用。 一个微不足道的方法是:

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

将inputstream封装在缓冲读取器中,然后使用读取方法一次读取一个字节,直到stream结束。

 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()”。 你可以把它转换成字符,而且你很好。

如果你使用BufferedReader你有几个选项。 这个缓冲读取器比读取器快,所以你可以包装它。

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

这读入char数组。 你有类似的select。 看文档。

将你的阅读器包装在一个BufferedReader中 ,该caching器保持一个缓冲区,以便更快地读取整个文件。 然后你可以使用read()来读取一个单独的字符(你需要投射)。 您也可以使用readLine()来获取整行,然后将其分解为单个字符。 BufferedReader也支持标记和返回,所以如果需要的话,可以多次读取一行。

一般来说,您要在实际使用的任何stream的顶部使用BufferedReader或BufferedInputStream,因为它们维护的缓冲区会使多次读取更快。

在java 5中增加了一个新的特性,即扫描器方法,它给出了在java中逐字读取input字符的机会。

例如; 使用Scanner方法import java.util.Scanner; 在主要方法之后:定义

扫描仪myScanner =新扫描仪(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(); } }