从文本文件中读取某些双精度到列表

时间:2018-02-05 15:14:06

标签: java arrays list file

我有这段代码从文本文件中读取数字(类型为double)到列表。

ArrayList listTest = new ArrayList();
try {
    FileInputStream fis = new FileInputStream(path);
    InputStreamReader isr = new InputStreamReader(fis, "UTF-16");
    int c;
    while ((c = isr.read()) != -1) {
        listTest.add((char) c);
    }
    System.out.println();
    isr.close();
} catch (IOException e) {
    System.out.println("There is IOException!");
}

但是,输出结果如下:

1
1
.
1
4
7

4
2
.
8
1
7
3
5

而不是

    11.147
    42.81735

如何逐行添加号码列表?

3 个答案:

答案 0 :(得分:2)

正如你所说它们是双打的,这会将它们转换为双打并将它们添加到双打列表中。这样做的好处是不会在列表中添加任何无法解析为double的内容,从而进行一些数据验证。

    List<Double> listTest = new ArrayList<Double>();
    try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-16"))) {
        String line;
        while ((line = br.readLine()) != null) {
            try {
                listTest.add(Double.parseDouble(line));
            } catch (NumberFormatException nfe) {
                // Not a double!
            }               
        }
        System.out.println();
    } catch (IOException e) {
        System.out.println("There is IOException!");
    }

答案 1 :(得分:1)

您可以将InputStreamReader打包在BufferedReader方法中readLine()

List<String> listTest = new ArrayList<String>();
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-16"))) {
    String line;
    while ((line = br.readLine()) != null) {
        listTest.add(line);
    }
    System.out.println(listTest);
} catch (IOException e) {
    System.out.println("There is IOException!");
}

另外,请注意自动关闭流的try-with-resources语句(如果使用的是JDK1.6或更低版本,请在close()块中调用finally方法。在示例代码中,如果存在异常,则流不会关闭。

答案 2 :(得分:0)

在你的代码中,你通过char读取输入char,这就是你看到这样一个输出的原因。您可以使用for (var key in arena) { console.log(key + " -> " + arena[key][0]); } 以更干净的方式阅读输入文件,而无需考虑流阅读器等。

Scanner