我正在尝试处理一个输入文件,其中包含必须用于计算的数字和需要用于比较的字符。一个简单的例子是这样的文件:
6
foobar
和如下代码:
n = readInInt
while n > 0
c = readInSingleChar
if (c = 'f')
doSomething
n--
目前我在这里找到了很多选项,并通过谷歌,涉及数据流和BufferedReader和FileReader,但似乎有太多的方式,我不确定他们都工作,我需要他们。如果我的需求不明确,请告诉我。
简而言之,我需要一个字符一个字符地读取文件,并将数字解释为整型,将字母和符号解释为字符。
最简单的方法是什么?我知道做事有专业的方法,也有"ok"的方法。这是一个一次性的,爱好式的个人使用的东西,我不寻找坚实或强大的功能。只要能正常工作就行了
谢谢!
我觉得最简单的方法是使用StreamTokenizer。这个类为您提供了解析整型或字符串所需的实用程序。
我会以-
开头StreamTokenizer tokenizer = new StreamTokenizer(new BufferedReader(new FileReader("foo.in")));
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (tokenizer.ttype == StreamTokenizer.TT_WORD)
// use tokenizer.sval
else if (tokenizer.ttype == StreamTokenizer.TT_NUMBER)
// use tokenizer.nval
}
下面是如何使用它的一个例子。以上是对文件进行标记和逐个字符读取的一种非常常见的方法。出于性能考虑,当然应该使用FileReader或Buffer。
你也可以使用扫描器。示例代码如下
Scanner s = new Scanner(file);
s.useDelimiter(""); // reads one char a time
while(s.hasNext()){
if(s.hasNextInt(){
// then do something with s.nextInt()
}else{
// then do something with s.next()
}
}
如果您正在寻找一个简单的解决方案,java.util.scanner将是一个不错的选择。
它有易于使用的方法来读取不同的数据类型(如int或String)。
您找到的使用I/O流的解决方案有点复杂,可能对您的任务不那么有用。他们将工作,尽管(并且是伟大的大规模应用程序)。
使用自定义分隔符的示例:
Scanner s = new Scanner(new File("txtfile.txt");
s.useDelimeter(Pattern.compile("n|"); //The newline character (n) and null
//character are the delimeters.
while (s.hasNext()) {
if (s.hasNextInt() {
//Do something
} else {
//Handle characters
}
}
(参考:Pattern)
这种直接方法的问题是它不能接受多位数整数。
另一种方法是使用标准分隔符。然后,当您想要读取字符时,读入整个令牌(在您的示例中,您将读入"foobar"),然后在循环中单独处理每个字符。
String str = s.next();
for(char c : str.toCharArray()) {
//handle characters
}