Как прочитать файл с несколькими типами данных в ArrayList с помощью сканера - PullRequest
1 голос
/ 11 марта 2012

Я пытаюсь прочитать файл нескольких типов данных в объект ArrayList, используя Scanner с разделителем "\ s \ s", однако он не работает должным образом. Я использую printf для просмотра правильности хранения данных, которые я буду использовать для расчетов позже. Кажется, что данные отображаются правильно, но я все еще получаю исключение «Неверный формат файла». Также, кажется, проблема с циклом. Я всегда застреваю при использовании ArrayList объектов.

Пример текстового файла:

item  item descr  100  1.50
item2  item descr  250  2.50
item2  item descr  250  3.50

Код:

import java.io.*;
import java.util.*;

public class ReadItems
{

    private Scanner input;
    ArrayList<Item> item = new ArrayList<Item>();

    //open text file
    public void openFile()
    {
        try
        {
            FileReader in = new FileReader("Items.txt");
            input = new Scanner(in).useDelimiter("\\s\\s");
        }
        catch( FileNotFoundException fileNotFound)
        {
            System.err.println( "Error opening file.");
            System.exit(1);
        }
    }

    //read file
    public void readFile()
    {
        try
        {
            while ( input.hasNextLine())
            {
                item.add( new Item(input.next(), input.next(), input.nextInt(), input.nextFloat() ));                                       
                for (Item list : item) 
                {
                    System.out.printf("%-10s%-48s$%5.2f\n", list.getCode(), (list.getDecription()+ ", "+ list.getWeight()+ "g"), + list.getPrice());
                    //System.out.println(item);
                }

            }

        }
        catch ( NoSuchElementException elementEx)
        {
            System.err.println( "Incorrect file format.");
            System.exit(1);
        }
        catch ( IllegalStateException stateEx )
        {
            System.err.println( "Error reading from file.");
            System.exit(1);
        }

    }

    public void closeFile()
    {
        if (input != null)
            input.close();      
    }

}

Выход:

item      item descr, 100g                                $ 1.50
item      item descr, 100g                                $ 1.50
item2     item descr, 250g                                $ 2.50
item      item descr, 100g                                $ 1.50
item2     item descr, 250g                                $ 2.50
item2     item descr, 250g                                $ 3.50

Неверный формат файла.

Извините, кажется, я делал глупости. Я не запускал программу в своем тестовом классе, где main.

Тестовый класс:

public class TestReadItems
{

public static void main(String[] args) 
{
ReadItems application = new ReadItems();
application.openFile();
application.readFile();
application.closeFile();
}
}

Программа работает без ошибок, однако я не могу заставить цикл while работать правильно. Выход утроен.

Ответы [ 2 ]

1 голос
/ 22 октября 2012

Это потому, что ваш цикл for для вывода на печать находится внутри цикла while. Таким образом, он читает каждую строку файла и возвращает результат. Поэтому для исправления замените выходной цикл for из оператора while и запишите его после завершения цикла while.

0 голосов
/ 11 марта 2012

Цикл может также взорваться с мусором в конце файла.Я добавил вызов .nextLine () после вызова item.add (), теперь он работает нормально.

while ( input.hasNextLine()) {
    item.add( new Item(input.next(), input.next(), input.nextInt(), input.nextFloat() ));                                       
    for (Item list : item) {
        System.out.printf("%-10s%-48s$%5.2f\n", list.getCode(), (list.getDecription()+ ", "+ list.getWeight()+ "g"), + list.getPrice());
    }
    input.nextLine(); // added
}
...