如何在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(); } }