3

Для одного из моих последних заданий в этом семестре мне пришлось создать программу инвентаризации, содержащую массив объектов Item. Каждый элемент содержит идентификатор (который присваивается при добавлении элемента и НЕ МОЖЕТ быть изменен), имя, описание, количество элементов и стоимость единицы товара.Java Inventory - Как читать файл с помощью FileInputStream?

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

Пункт Класс

import java.text.NumberFormat; 

public class Item 
{ 
    private int ID; 
    private String name; 
    private String Desc; 
    private int onHand; 
    private double unitPrice; 

    public Item(int pID) 
    { 
     ID = pID; 
    } 

    public Item(int pID, String pName, String pDesc, int pOnHand, Double pUnitPrice) 
    { 
     ID = pID; 
     name = pName; 
     Desc = pDesc; 
     onHand = pOnHand; 
     unitPrice = pUnitPrice; 
    } 

    public void display() 
    { 
     NumberFormat dollars = NumberFormat.getCurrencyInstance(); 
     System.out.printf("%-6s%-20s%-24s%-12s%-6s\n", ID, name, Desc, onHand, dollars.format(unitPrice)); 
    } 

    // GETTERS AND SETTERS 
    public int getID() 
    { 
     return ID; 
    } 

    public void setName(String pName) 
    { 
     name = pName; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public void setDesc(String pDesc) 
    { 
     Desc = pDesc; 
    } 

    public String getDesc() 
    { 
     return Desc; 
    } 

    public void setOnHand(int pOnHand) 
    { 
     onHand = pOnHand; 
    } 

    public int getOnHand() 
    { 
     return onHand; 
    } 
    public void setUnitPrice(double pUnitPrice) 
    { 
     unitPrice = pUnitPrice; 
    } 

    public double getUnitPrice() 
    { 
     return unitPrice; 
    } 

} 

Инвентарь Класс

import java.util.Scanner; 
import java.io.PrintWriter; 
import java.io. FileOutputStream; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 

public class Inventory 
{ 
    int max = 30; 
    int count = 0; 
    Item myItem[] = new Item[max]; 
    Scanner scannerObject = new Scanner(System.in); 

    public void addItem() 
    { 
     try{ 
      if (count >= max) 
      { 
       System.out.println("\nNo more room!"); 
      }else{ 
       System.out.print("\nPlease enter name of item: "); 
       String lname = scannerObject.nextLine(); 
       System.out.print("\nPlease enter a brief description of the item: "); 
       String ldesc = scannerObject.nextLine(); 
       System.out.print("\nPlease enter the amount on hand: "); 
       int lonHand = scannerObject.nextInt(); 
       System.out.print("\nPlease enter unit price of the item: $"); 
       Double lunitPrice = scannerObject.nextDouble(); 
       myItem[count] = new Item(count + 1, lname, ldesc, lonHand, lunitPrice); 
       count++; 
       System.out.println("\nThank you. The ID number for " + lname + " is " + count); 
       scannerObject.nextLine(); 
      } 
     }catch(Exception e) 
     { 
      System.out.println("\nERROR! Please try again:\n"); 
      scannerObject.nextLine(); 
     } 

    } 

    public int findItem() 
    { 
     int found = -1; 
     int inputID =0; 
     try{ 
      System.out.print("\nGreetings, please enter the ID number for item:\n"); 
      inputID = scannerObject.nextInt(); 
      for(int i = 0; i < count; i++){ 
       if(myItem[i].getID() == inputID){ 
        found = i; 
        scannerObject.nextLine(); 
       } 
      } 
     }catch(Exception e) 
     { 
      System.out.println("\nERROR!"); 
      scannerObject.nextLine(); 
     } 
     return found; 
    } 

    public void modify() 
    { 
     int lfound = findItem(); 
     if (lfound == -1){ 
      System.out.println("\nInvalid input! Please try again:"); 
      scannerObject.nextLine(); 
     }else{ 
      try{ 
       System.out.print("\nPlease enter name of item: "); 
       String lname = scannerObject.nextLine(); 
       myItem[lfound].setName(lname); 
       System.out.print("\nPlease enter a brief description of the item: "); 
       String ldesc = scannerObject.nextLine(); 
       myItem[lfound].setDesc(ldesc); 
       System.out.print("\nPlease enter the amount on hand: "); 
       int lonHand = scannerObject.nextInt(); 
       myItem[lfound].setOnHand(lonHand); 
       System.out.print("\nPlease enter unit price of the item: $"); 
       double lunitPrice = scannerObject.nextDouble(); 
       myItem[lfound].setUnitPrice(lunitPrice); 
       scannerObject.nextLine(); 
      }catch (Exception e) 
      { 
       System.out.println("\nInvalid command! Please try again: "); 
       scannerObject.nextLine(); 
      } 
     } 
    } 

    public void displayAll() 
    { System.out.println("_______________________________________________________________________________\n"); 
     System.out.println("         Inventory          "); 
     System.out.println("_______________________________________________________________________________\n"); 
     System.out.printf("\n%-6s%-20s%-24s%-12s%-6s\n", "ID:", "Name:", "Description:","On Hand:", "Unit Price:\n"); //Header 
     System.out.println("_______________________________________________________________________________\n"); 
     for(int i = 0; i < count; i++){ 
      myItem[i].display(); 
     } 
    } 

    public void displayOne() 
    { 
     int lfound = findItem(); 
     if (lfound == -1){ 
      System.out.println("\nInvalid input! Please try again:"); 
     }else{ 
      System.out.println("_______________________________________________________________________________\n"); 
      System.out.println("         Inventory          "); 
      System.out.println("_______________________________________________________________________________\n"); 
      System.out.printf("\n%-6s%-20s%-24s%-12s%-6s\n", "ID:", "Name:", "Description:","On Hand:", "Unit Price:\n"); //Header 
      System.out.println("_______________________________________________________________________________\n"); 
      myItem[lfound].display(); 
     } 
    } 

    public void saveFile() 
    { 
     PrintWriter outputStream = null; 
     try{ 
      outputStream = 
       new PrintWriter(new FileOutputStream("H:\\Java\\saveFile.txt")); 
     }catch (FileNotFoundException e) 
     { 
      System.out.println("Error!"); 

     } 
     if(outputStream != null) 
      for(int i = 0; i < count; i++){ 
       outputStream.println(myItem[i].getID()); 
       outputStream.println(myItem[i].getOnHand()); 
       outputStream.println(myItem[i].getUnitPrice()); 
       outputStream.println(myItem[i].getName()); 
       outputStream.println(myItem[i].getDesc()); 
      } 
     outputStream.close(); 
    } 
} 

пользователя Класс

import java.util.Scanner; 

public class inventUser 
{ 

    public static void main(String[] args) 
    { 
     Inventory myInvent = new Inventory(); 
     Scanner scannerObject = new Scanner(System.in); 
     int Choice = 0; 

     do{ 

      dispMenu(); 

      Choice = getChoice(scannerObject); 

      proChoice(Choice, myInvent); 

     }while (Choice !=0); 
    } 

    public static void dispMenu() 
    { 
     System.out.println("\n|=============================================|"); 
     System.out.println("|            |"); 
     System.out.println("|******************Welcome********************|"); 
     System.out.println("|_____________________________________________|"); 
     System.out.println("|            |"); 
     System.out.println("|  Press [1] To Add An Item    |"); 
     System.out.println("|            |"); 
     System.out.println("|  Press [2] To Display One Item   |"); 
     System.out.println("|            |"); 
     System.out.println("|  Press [3] To Display All Items  |"); 
     System.out.println("|            |"); 
     System.out.println("|  Press [4] To Modify An Item   |"); 
     System.out.println("|            |"); 
     System.out.println("|  Press [0] To Exit      |"); 
     System.out.println("|_____________________________________________|"); 
     System.out.println("|=============================================|"); 
     System.out.println("|   Please Make Selection Now...  |"); 
     System.out.println("|=============================================|"); 
     System.out.println("|_____________________________________________|\n"); 
    } 

    public static int getChoice(Scanner scannerObject) 
    { 
     boolean x = false; 
     int pChoice = 0; 
     do{ 
      try{ 
       pChoice = scannerObject.nextInt(); 
       x = true; 
      }catch (Exception e){ 
       scannerObject.next(); 
       System.out.println("\nInvalid command! Please try again:\n"); 
      } 
     }while (x == false); 
     return pChoice; 
    } 

    public static void proChoice(int Choice, Inventory myInvent) 
    { 
     switch(Choice){ 
      case 1: myInvent.addItem(); 
       break; 
      case 2: myInvent.displayOne(); 
       break; 
      case 3: myInvent.displayAll(); 
       break; 
      case 4: myInvent.modify(); 
       break; 
      case 0: System.out.println("\nHave a nice day!"); 
       break; 
     }myInvent.saveFile(); 
    } 
} 

За мой инструктор, мне нужно, чтобы мои методы сохранения файла и прочитать в моем классе инвентаризации. Мне нужно вызвать их в моем классе пользователя. Хотя у меня есть «getter» для моей переменной Item ID, мне не разрешено использовать «setter».

Я до сих пор довольно новичок в Java, поэтому, пожалуйста, извините за ошибки новобранец. Опять же, любая помощь очень ценится! Я посмотрел в своей книге и на Google Googled, но я не мог найти ничего, что могло бы повлиять на мою ситуацию.

+0

я предлагаю и использовать разделитель, такие как '' или пространство для разделения ваших данных в текстовом файле (для информации одного пользователя). Затем используйте новую строку для разделения записи каждого пользователя. – root

+0

Ницца! Я действительно думал об этом, но не был уверен. –

+0

Затем вы можете использовать метод 'useDelimiter()' в классе сканера. – root

ответ

1

Чтобы прочитать файл, используя FileInputStream просто использовать:

Scanner input = new Scanner(new FileInputStream("path_to_file")); 

Используйте методы сканера для чтения

while(input.hasNextLine()) { //or hasNextInt() or whatever you need to extract 
    input.nextLine() //... read in a line of text from the file 
} 

Вы также можете использовать класс File, если вы хотите, чтобы выполнить какие-либо манипуляции файлов с помощью File класс

File myTextFile = new File("path_to_file"); 
Scanner input = new Scanner(new FileInputStream(myTextFile)); 

Вам необходимо, конечно же, уловить FileNotFoundException

В противном случае это действительно то же самое, что вы делали для PrintWriter. Просто включите FileOutputStream для FileInputStream и PrintWriter для Scanner, но не забудьте сначала закрыть файл при переходе от записи или чтения из файла:

input.close() // or output.close() 
+0

Хорошо, я вижу, что вы делаете. Но как бы присвоить их соответствующим переменным? Например, назначьте идентификатор ID переменной идентификатора, имя для переменной имени и так далее? –

+1

при чтении данных из текстового файла вы, скорее всего, создадите новый экземпляр «Item», передающий значения, полученные из текстового файла, в конструктор или с помощью соответствующих методов настройки. – root

+1

Ну, вы можете сказать, что новый элемент (input.nextInt(), input.next(), input.next(), input.nextInt(), input.nextDouble()); Но для этого вы должны обеспечить, чтобы каждый элемент в текстовом файле находился в отдельной строке с каждой частью данных в правильном порядке вашего конструктора (или создавал ваш конструктор правильный порядок данных, как в текстовом файле) – APengue