Чтение удваивается из файла .txt в список - PullRequest
0 голосов
/ 30 марта 2011

Я пытаюсь прочитать дубликаты из файла .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

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 30 марта 2011

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);
    }
  }
}

Но если ваш файл разделяет числа по-разному (например, пробел или запятая), вам потребуется проделать небольшую дополнительную / другую работу при чтении файла, чтобы извлечь (проанализировать) ваши значения.

Парсинг - это токенизация ваших данных, чтобы вы могли извлечь интересующие вас биты.

0 голосов
/ 04 апреля 2011

DataInputStream только для чтения вещей, записанных с соответствующим потоком вывода.Для текстового файла создайте InputStreamReader вокруг вашего FileInputStream (не забудьте указать кодировку), а затем BufferedReader, чтобы вы могли читать по строкам.Затем используйте класс Double для разбора строк.

0 голосов
/ 30 марта 2011

Вероятно, это строка "EOF = false" .. которая назначает "false" для "EOF" и всегда будет истинной. Попробуйте изменить его на «EOF == false».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...