jer*_*son 46 java character tokenize
我习惯了c风格getchar()
,但似乎没有什么比得上java了.我正在构建一个词法分析器,我需要逐个读入输入字符.
我知道我可以使用扫描程序扫描令牌或行,并通过char-by-char解析令牌,但对于跨越多行的字符串来说,这似乎很笨重.有没有办法在Java中从输入缓冲区获取下一个字符,或者我应该只使用Scanner类插件?
输入是文件,而不是键盘.
McD*_*ell 58
使用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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面代码的坏处是它使用了系统的默认字符集.在可能的情况下,更喜欢已知的编码(理想情况下,如果您有选择,可以使用Unicode编码).有关更多信息,请参阅Charset类.(如果您感到受虐狂,可以阅读本指南以进行字符编码.)
(您可能需要注意的一件事是补充Unicode字符 - 那些需要存储两个char值的字符.有关详细信息,请参阅Character类;这是一个可能不适用于作业的边缘情况.)
ror*_*rle 15
结合其他人的建议来指定字符编码和缓冲输入,我认为这是一个非常完整的答案.
假设您有一个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
}
Run Code Online (Sandbox Code Playgroud)
将输入流包装在缓冲读取器中,然后使用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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
另一个选择是不按字符读取内容 - 将整个文件读入内存.如果您需要多次查看字符,这非常有用.一个微不足道的方法是:
/** 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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
231095 次 |
最近记录: |