使用Java中的Scanner解析文本文件或控制台输入并遇到错误

时间:2013-05-08 01:05:26

标签: java java.util.scanner java-6

我正在尝试从单个项目与回车之间的空格分隔的文件中读取值。

因此文本文件类似于

1 lunch box 3.99
2 jelly donuts 1.99
4 cases of beer 36.99
2 chess boards 24.99

有了这些值,我正在尝试构建对象......所以对象将由数量,行上的第一件事,一个名字 - 行上的第二件事,以及最后一件事的价格构成这条线。所以构造函数就像:

product(int x, String name, float price) { 
 this.x = x;
 this.name = name;
 this.price = price;
}

我的问题是我编码扫描程序在尝试解析所有内容时遇到麻烦的方式。所以我收到了java.util.InputMismatchException。如果我使用如下算法:

if (scannerRef.hasNextInt()) 
  arraylistRef.intThing = scannerRef.nextInt();

if (scannerRef.hasNext())
   arraylistRef.name = scannerRef.next();

if (scannerRef.hasNextFloat())
   arrayListRef.price = scannerRef.nextFloat();

然后代码按照我的方式将每个单独的原语或String放在它自己的对象中,而不是循环整行,然后将它添加到对象

我希望这是有道理的。如果您现在正在阅读,请感谢您的阅读。

我关注的代码的主要部分是: 我在这里使用上述类型的算法进行注释的方式将所有内容放入同一个对象但运行到java.util.InputMismatchException dingo brains

// loop while there is text to read
while (s1.hasNextLine()) {
    Product p = new Product(p.quantity = s1.next);
  //if (s1.hasNextInt())
     p.quantity = s1.nextInt();


//  else 
     p.name = s1.next(); // to get strings

     // else if(s1.hasNextFloat())
     p.price = s1.nextFloat();

 // now add the line to the product arraylist
 foo.add(p);

}

1 个答案:

答案 0 :(得分:2)

您希望逐行将文件数据转换为String(您喜欢的任何Collection类型),然后将其拆分到找到空格的位置并相应地存储数据。要接受你使用的整行:

nextLine();

这样你就会得到一个字符串"1 lunch box 3.99"。然后,您可以在找到空格的地方拆分它,并将1存储为int,将lunchbox存储为字符串,将3.99存储为双精度(使用双精度存储空间)不推荐)。

您可以在此处搜索有用的方法:http://docs.oracle.com/javase/6/docs/api/java/lang/String.html例如,split()方法。

以下是有关如何使用split()的示例:

假设您的输入行是1 lunch box 3.99。您已经将它读入字符串,如下所示:

String example = "1 lunch box 3.99"

要使用split()方法在空白处拆分此String,您需要执行以下操作:

String[] splitString = example.split(" ");

这将为您提供一个包含以下值的String数组:

{"1", "lunch", "box", "3.99"};

然后,您可以使用Integer.parseIntDouble.parseDouble等内容将这些值解析为正确的类型。