2012-03-10 1 views
1

Я пытаюсь прочитать файл с несколькими типами данных в объект ArrayList с помощью Scanner с разделителем «\ s \ s», однако он не работает должным образом , Я использую printf для просмотра, если данные будут храниться правильно, данные, которые я буду использовать для вычислений позже. Кажется, что данные отображаются правильно, но я все еще получаю исключение «Неправильный формат файла». Также возникает проблема с циклом. Я всегда застреваю при использовании ArrayList объектов. текстовый файлКак прочитать несколько файлов типа данных в 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(); 
} 
} 

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

ответ

1

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

+0

Пример кода был бы полезен –

+0

Да, я смотрю на этот SSCCE, и я думаю про себя, я написал это или задал этот вопрос? Удивительно, сколько можно узнать за несколько месяцев :) – xiphias

0

Петля также может взорваться нежелательной в конце файла. Я добавил вызов .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 
} 
+0

не ** \\ s ** реализует все пробельные символы (пробелы, табуляции, символы новой строки)? Поэтому я считаю, что ** \ n ** не повлияет. Также я использую 'input.hasNextLine()'. Я попробовал, такие же результаты. Любые комментарии к циклу while? – xiphias

+0

Я был немного замешан в своем комментарии. Как это работает для вас? Почему? hmmm – xiphias

+0

Извините, но ваши предложения оказались бесполезными, спасибо. – xiphias