从1个文件中读取以生成2个文件

时间:2013-10-02 22:53:59

标签: java

我一直在努力为我的学业和我的生活做这个问题我无法理解。 问题是:编写一个读取“working_example_1 / babynames.txt”的程序,并生成两个文件boynames.txt和girlnames.txt,分隔男孩和女孩的数据。

这是来自wiley.com/go/javaexamples的Worked Example 11中的代码,用于解决此问题:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class BabyNames
{
public static final double LIMIT = 50;

public static void main(String[] args) throws FileNotFoundException
{
    Scanner in = new Scanner(new File("babynames.txt"));

    RecordReader boys = new RecordReader(LIMIT);
    RecordReader girls = new RecordReader(LIMIT);

    while (boys.hasMore() || girls.hasMore())
    {
        int rank = in.nextInt();
        System.out.print(rank + " ");
        boys.process(in);
        girls.process(in);
        System.out.println();
    }

    in.close();
}
}

而且:

import java.util.Scanner;

public class RecordReader
{
private double total;
private double limit;

public RecordReader(double aLimit)
{
    total = 0;
    limit = aLimit;
}

public void process(Scanner in)
{
    String name = in.next();
    int count = in.nextInt();
    double percent = in.nextDouble();

    if (total < limit)
    {
        System.out.print(name + " ");
    }

    total = total + percent;
}

public boolean hasMore()
{
    return total < limit;
}
}

我创建了babynames.txt并放入与.java文件相同的src文件夹,如果我使用

指定文件的直接路径,则会找到找不到的文件
Scanner in = new Scanner(new File("C:/Users/me/SkyDrive/Schoolwork/CIS150AB/Chapter 11.1/src/babynames.txt"));

它找到了该文件,但却给了我这个错误:

Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at BabyNames.main(BabyNames.java:20)

对我来说,看起来这个错误是因为第20行,其中int rank = in.nextInt();当它寻找一个int时它寻找一个字符串,但这是直接来自Wiley网站,所以我不确定。

对此的任何帮助都会受到赞赏,显然我不适合Java的在线课程。下一堂课,一旦有一个按照我的日程安排工作,我就上学了。

1 个答案:

答案 0 :(得分:0)

如果{babisames.txt的格式为this,那么这就是发生的事情(我想,没试过)。

  • 扫描仪“in”将第一个int读入“rank”(OK)
  • 进入boys.process()
    • “in”读取名字(雅各布)
    • “in”尝试读取第一个int(1),但找到1.0013,这不是int

这种情况与你的错误不符(你从RecordReader而不是BabyNames得到一个堆栈跟踪),但是思路可能对你有用。

尝试使用调试器。如果不能,请使用in.next()而不是in.nextInt()或in.nextDouble()。你可以打印这个值,看看为什么它不是你想象的那样。

你的问题实际上提出了两个问题。隐藏的答案可能是:

try (InputStream inputStream = BabyNames.class.getResourceAsStream("/babynames.txt");
     Scanner in = new Scanner(inputStream))
{
    // do stuff with in
}