2011-07-28 175 views
0

我想处理一个输入文件,其中包含我必须用于计算和我需要用于比较的字符的数字。一个简单的例子是这样的文件:如何从文件中逐个读取整数和字符?

6 
foobar 

和这样的代码:

n = readInInt 
    while n > 0 
    c = readInSingleChar 
    if (c = 'f') 
     doSomething 
    n-- 

目前我发现很多的选择在这里通过谷歌,涉及的数据流中和BufferedReader和FileReader及但似乎有太多的方法,我不知道他们都工作,我也需要他们。请让我知道我的需求是否不明确。

简而言之,我需要逐个字符地读取文件字符,并将数字作为整数进行解释/使用,将字母和符号作为字符进行解释/使用。

这样做最简单的方法是什么?我知道有专业的方式来做事情,而“确定”的方式来做事情。这是一次性的爱好类个人使用的事情,我不想寻找稳固或强大的功能。它只需要工作好。

谢谢!

+1

你还可以在你试过一些代码吗?你在哪里遇到问题?性能?还有别的吗? –

+0

你有一些文字和一些计算方法吗(不要在一行上混合两个文字)?你只在某些行上有数字,还是带有“+”或“add”的数字? – toto2

回答

1

我觉得最简单的方法就是使用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 
      } 

这里是一个如何使用它的一个example。以上是标记文件和按字符读取char的非常常见的方式。出于性能原因,您当然应该使用FileReader或Buffer。您可以使用Scanner。示例代码会像

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() 
    } 
} 
+0

也更多的帮助在这里http://stackoverflow.com/questions/2597841/scanner-method-to-get-a-char –

+0

伟大的,我不知道离开参数useDelimiter空白会做到这一点。 我现在唯一的问题是,它遇到一个新的行时似乎中断。我该如何解决这个问题? – Matthew

+0

@Mathew别忘了接受答案。 –

1

如果你正在寻找一个简单的解决方案,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 
} 
+0

+1扫描仪也是一个很好的解决方案 –

+0

我原本试图使用扫描仪,但我有一个问题。我如何确保它一次只接受一个数字,字母或符号?关于从文件读取时控制输入的唯一知识是使用分隔符。 我该如何确保以字符串形式扫描字母时,它只能读取一个字母而不是一组字母或一行? – Matthew

+0

@Mathew,你需要使用sc.useDelimiter(“”)。查看我的代码以获取示例。 –

相关问题