【问题标题】:Reading doubles from .txt file into a List将 .txt 文件中的双打读入列表
【发布时间】:2011-03-30 14:19:57
【问题描述】:

我正在尝试从 .txt 文件中读取双精度并将它们全部放入一个列表中。

这是我目前的代码 ->

(我有一种方法可以请求文件并获取数据流,还有一种方法可以将双精度数据放入列表中。)

    public InputFile () throws MyException {
    fileIn = null;
    dataIn = null;
    do {
        filename = JOptionPane.showInputDialog("What is the file called? ");
        try {
            fileIn = new FileInputStream((filename + ".txt"));
            dataIn = new DataInputStream(fileIn);

            return;
        }
            catch (FileNotFoundException e) {
            JOptionPane.showMessageDialog(null, "There is no "+filename + ".txt");
        }
   }
   while (   Question.answerIsYesTo("Do you want to retype the file name")   );
   throw new MyException("No input file was chosen");
}

这部分工作正常。

        public ProcessMain() {
        boolean EOF = false;

    List <Double> allNumbers = new ArrayList <Double> () ;

            try {

                InputFile inputFile = new InputFile();

                        while(EOF == false) {
                        try {
                          allNumbers.add(inputFile.dataIn.readDouble());
                            }
                        catch(EOFException e){ EOF = true; }
                        }

         // List manipulation here. I have no problems with this part.

    }
    catch (Exception e) {
        System.out.println(e);
    }

     System.out.println(allNumbers);

我得到以下信息 -

java.lang.IndexOutOfBoundsException:索引:0,大小:0

有什么想法吗?

【问题讨论】:

  • InputFile2 是什么?你的意思是InputFile inputFile2 = new InputFile()?哪一行代码抛出异常?
  • 是的,我把 2 放错了。
  • 哪一行抛出异常?
  • 您不应该使用new Double() 构造函数。您可以将double 直接传递给allNumbers.add(),它将autoboxed 传递给Double。如果您想明确地将double 装箱,请使用Double#valueOf() 而不是new Double() - 在这种情况下您不需要自己解析字符串,因为Double#valueOf() 可以接受一个字符串。
  • 好的,所以我不再遇到异常,但唯一的输出是'[]'。谢谢。

标签: java list double text-files


【解决方案1】:

DataInputStream 真正用于读取二进制数据,例如从一个插座。我认为您想要的只是简单的FileReader,然后使用Double.parseDouble(String)Double.valueOf(String) 进行解析 - 取决于您是要获得原始还是对象双打。

如果您的输入文件在新行中包含每个数字,您可以使用BufferedReader.readLine。否则,您将需要一些简单的解析,例如查找空格或逗号分隔的值。

因此,例如,要读取包含新行中每个数字的文件,您可以执行以下操作:

import java.io.*;

public class DoubleReader {
  public static void main(String[] args) throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader(args[0]));
    String line = null;
    while((line = reader.readLine()) != null) {
        Double d = Double.valueOf(line);
        System.err.println(d);
    }
  }
}

但是,如果您的文件以不同的方式分隔数字(例如空格或逗号),则在读取文件以提取(解析)您的值时,您将需要做一些额外/不同的工作。

Parsing 是关于标记您的数据,以便您可以提取您感兴趣的位。

【讨论】:

  • 是的,这似乎是要走的路。所以我只需要一个 FileReader 而不是 DataInpuStream?您能否详细说明一下 .parseDouble() 和一般解析?非常感谢!我想我是在用 DataInputStream 给自己挖一个洞。
【解决方案2】:

这可能是“EOF = false”行..将“false”分配给“EOF”并且永远为真。尝试将其更改为“EOF == false”。

【讨论】:

  • 或(!EOF)。是 (EOF=false) 会将 false 分配给 EOF 并评估为 false,这会在读取任何内容之前终止循环,从而为您提供一个空数组并因此引发异常
  • 它捕获并丢弃 EOFException 以设置 EOF 并中断循环。 :P
【解决方案3】:

DataInputStream 仅用于读取使用相应输出流写入的内容。对于文本文件,在您的 FileInputStream 周围创建一个 InputStreamReader(记得指定编码),然后创建一个 BufferedReader 以便您可以逐行阅读。然后使用 Double 类来解析字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多