如何从文件中一个接一个地读取整型和字符



我正在尝试处理一个输入文件,其中包含必须用于计算的数字和需要用于比较的字符。一个简单的例子是这样的文件:

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
}

最新更新