如何从.text文件中读取双精度到ArrayList中

时间:2014-03-04 16:20:45

标签: java arraylist java.util.scanner

我正在尝试从包含100,000个双打的文件中读取双打,这些文件以两个双打的行排列,每个双打由一个空格隔开。像这样:

2.54343 5.67478
1.23414 5.43245
7.64748 4.25536
...

到目前为止我的代码:

Scanner numFile = new Scanner(new File("input100K.txt").getAbsolutePath());
ArrayList<Double> list = new ArrayList<Double>();
while (numFile.hasNextLine()) {
    String line = numFile.nextLine();
    Scanner sc = new Scanner(line);
    sc.useDelimiter(" ");
    while(sc.hasNextDouble()) {
        list.add(sc.nextDouble());
    }
    sc.close();
}
numFile.close();
System.out.println(list);
}

此代码运行后,它会打印到控制台并清空ArrayList [],我无法弄清楚原因。

从文件中删除getAbsolutePath()会给我这一行:

Scanner numFile = new Scanner(new File("input100K.txt"));

但是当我运行程序时,它给了我一个FileNotFoundException。我知道文件存在,我可以看到并打开它。

input100K.txt与程序一起位于src包文件夹中。有什么特定的文件必须在哪里工作?

编辑:正如 Evgeniy Dorofeev 指出的那样,该文件需要位于项目文件夹(src文件夹的父文件夹)中,以便程序找到它。

4 个答案:

答案 0 :(得分:4)

当你创建像这样new Scanner(new File("input100K.txt").getAbsolutePath())的扫描仪时;您正在扫描文件路径作为输入而不是文件本身。这样做new Scanner(new File("input100K.txt"));

答案 1 :(得分:0)

您可以尝试在刚刚阅读的行上使用split()方法,然后将每个部分解析为double。请注意,没有必要创建两个Scanner s:

Scanner sc = new Scanner(new File("input100K.txt"));
sc.useDelimiter(" ");
ArrayList<Double> list = new ArrayList<Double>();

while (sc.hasNextLine()) {
    String[] parts = sc.nextLine().split(" "); // split each line by " "
    for (String s : parts) {
        list.add(Double.parseDouble(s)); // parse to double
    }
}
sc.close();

System.out.println(list);

答案 2 :(得分:0)

替换

Scanner numFile = new Scanner(new File("input100K.txt").getAbsolutePath());

Scanner numFile = new Scanner(new File("input100K.txt"));

答案 3 :(得分:0)

以下是一个示例程序:

public static void main(String[] args) throws FileNotFoundException {

        List<Double> doubleList = new ArrayList<Double>();
        Scanner scanner = new Scanner(new File("/home/visruthcv/inputfile.txt"));
        while (scanner.hasNextDouble()) {

            double value = scanner.nextDouble();

            System.out.println(value);

            doubleList.add(value);

        }
        /*
         * for test print
         */
        for (Double eachValue : doubleList) {
            System.out.println(eachValue);
        }

    }