2014-10-20 1 views
2

Я пишу программу, которая открывает файл, который выглядит следующим образом: сначалаКак читать в String из файла, который может быть или не быть?

 
3000.0 
Lamps 15.3 400 
Chairs 19.95 250 
Desks 95.0 300 

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

Однако в течение всей программы мы вносим изменения в файл и сохраняем то, что было сделано в конце, используя объект Printwriting. Одна из вещей, которые мы можем сделать в ходе программы, - это добавить новые предметы в инвентарь. Тем не менее, я должен иметь возможность читать в продукте, который имеет несколько имен, например, настольные стулья. Поскольку мой код написан сейчас, файл читает только имя, а затем переходит прямо к цене, поэтому, если я пытаюсь прочитать многословное имя, он дает мне ошибку времени выполнения, поскольку я пытаюсь читать строку с двойным. Поэтому, как я читаю строку, которая МОЖЕТ ИЛИ НЕ МОЖЕТ иметь две строки в ней? И, если есть две строки, как мне написать ее так, чтобы она хранила оба из них в одной и той же переменной String? Вот мой код:

File file = new File("inventory.txt"); 
    Scanner inputFile = new Scanner(file); 

    ArrayList<String> productName = new ArrayList<String>(); 
    ArrayList<Double> productQuantity = new ArrayList<Double>(); 
    ArrayList<Double> productPrice = new ArrayList<Double>(); 

    double balance = inputFile.nextDouble(); 

    while (inputFile.hasNext()) 
    { 
     String product = inputFile.next(); 
     double price = inputFile.nextDouble(); 
     double quantity = inputFile.nextDouble(); 

     //Takes those variables and stores each of them in ArrayList objects 
     productName.add(product); 
     productPrice.add(price); 
     productQuantity.add(quantity); 
    } 

    inputFile.close(); 
+0

Проверили ли вы это? [Проверить существующий файл с помощью java] (https://stackoverflow.com/questions/1816673/how-do-i-check-if-a-file-exists-java-on-windows) –

+0

@Freezzo - это строка это может быть или не быть, а не файл. –

+0

Мне не нужно проверять, существует ли файл. Я знаю, как это сделать. Мне нужно иметь возможность читать более чем одну строку, если есть имя продукта с более чем одним словом. Например, если есть строка с надписью «Desk Sairs 20.5 300», мне нужно иметь возможность хранить имя «Desk Chairs» в одной переменной String, но для этой строки только потому, что есть еще три строки с именами только одного слова , – user3525572

ответ

1

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

Но если у вас нет контроля над тем, как файл написан, тогда вы можете попробовать разместить функцию nextDouble() в блоке try, чтобы увидеть, смотрите ли вы цену или следующее слово имени. Обратите внимание, что в случае, если второе слово названия продукта - это число, это не будет работать так, как было запланировано.

File file = new File("inventory.txt"); 
Scanner inputFile = new Scanner(file); 

ArrayList<String> productName = new ArrayList<String>(); 
ArrayList<Double> productQuantity = new ArrayList<Double>(); 
ArrayList<Double> productPrice = new ArrayList<Double>(); 

double balance = inputFile.nextDouble(); 

while (inputFile.hasNext()) 
{ 
    String product = inputFile.next(); 
    try{ 
     double price = inputFile.nextDouble(); 
    } 
    catch(Exception e){ 
     product = product+" "+inputFile.next(); 
     double price = inputFile.nextDouble(); 
    } 
    double quantity = inputFile.nextDouble(); 

    //Takes those variables and stores each of them in ArrayList objects 
    productName.add(product); 
    productPrice.add(price); 
    productQuantity.add(quantity); 
} 

inputFile.close(); 
+0

Благодарим вас за помощь, но это не то, с чем я знаком, и не буду чувствовать себя комфортно, используя его в программе для этого класса, поскольку мы еще не узнали об этом. – user3525572

+0

И мне не разрешено изменять формат файла. – user3525572

+0

[Обработка исключений] (http://www.tutorialspoint.com/java/java_exceptions.htm) - очень простая концепция программирования. Я понимаю, что вы еще не научились этому, но если он решает вашу проблему, вам обязательно стоит подумать над ее использованием и, что более важно, узнать больше об этом, поскольку они невероятно полезны. – EnKrypt

0

Хорошо, так что если вы хотите сохранить свой собственный формат, вы будете нуждаться, чтобы перестроить свой код таким образом, что это означает, что данные в более простом способе. Прежде всего, вам понадобится Object. Назовем это Product.

public class Product { 
    private String name; 
    private int quantity; 
    private double price; 

    public Product(String name, int quantity, double price) { 
     this.name = name; 
     this.quantity = quantity; 
     this.price = price; 
    } 
} 

Теперь у вас есть хорошее представление для каждого блока, вам нужен хороший способ написать их. Теперь вы эффективно писать String обратно в File, так что давайте использовать метод toString(), чтобы выяснить, как это должно выглядеть:

public String toString() { 
    return name + " " + quantity + " " + price; 
} 

Затем вы откроете в в FileWriter перезаписать режим, цикл через ваш новый List из Product типов, и просто напишите значение toString(). Вы заметите, что здесь не приведен конкретный пример кода. Вы можете это исправить!

Преимущества этого подхода

  • Большой является то, что у вас есть объектное представление вашего всего файла. Это означает, что в течение всего срока действия вашего приложения вы можете обновлять список объектов и не прикасаться к файлу.

Неудобство

  • Вам нужно переписать весь файл каждый раз, когда вы сохраните. Если вы будете умны, когда будете сохранять свои данные, все будет в порядке.
0

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

public static boolean isNumeric(String str) 
{ 
try 
{ 
    double d = Double.parseDouble(str); 
} catch(NumberFormatException nfe) 
    { 
     return false; 
    } 
return true; 
} 

Для хранения обеих строк в одной переменной, использовать StringBuffer в случае, если вторая строка не является числовым и преобразовывать StringBuffer позже String.

0

Не используйте сканер, используйте буферный читатель, читать построчно, а затем разделить результат и анализировать в зависимости от числа:

File file = new File("inventory.txt"); 
BufferedReader reader = new BufferedReader(new FileReader(file)); 
double balance = Double.parseDouble(reader.readLine()); 
while (true) { 
    String line = reader.readLine(); 
    if (line == null) { 
    break; 
    } 
    String[] parts = line.split(" "); 
    int count = parts.length; 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < count - 2; i++) { 
    if (i > 0) { 
     i.append(' '); 
    } 
    sb.append(parts[i]); 
    } 
    String productName = sb.toString(); 
    double price = Double.parseDouble(parts[count - 2]); 
    double quantity = Double.parseDouble(parts[count - 1]); 

    productName.add(product); 
    productPrice.add(price); 
    productQuantity.add(quantity); 
} 
reader.close();