Java Inventory - 如何使用 FileInputStream 读取文件?

Posted

技术标签:

【中文标题】Java Inventory - 如何使用 FileInputStream 读取文件?【英文标题】:Java Inventory - How to read a file using FileInputStream? 【发布时间】:2015-06-22 06:47:38 【问题描述】:

对于我本学期的最后一项作业,我必须创建一个包含 Item 对象数组的库存程序。每个项目都包含一个 ID(在您添加项目时分配并且不能修改)、名称、描述、现有项目数量和单价。

我还需要使用 File I/O Stream 保存和加载文件。我可以很好地保存到文本文件。但是,我无法开始使用我的 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();
    

根据我的导师的说法,我需要在我的清单类中使用我的保存和读取文件方法。我需要在我的用户类中调用它们。虽然我的 Item ID 变量有一个“getter”,但我不能使用“setter”。

我对 Java 还很陌生,所以请原谅任何新手错误。再次,非常感谢任何帮助!我查看了我的书并在 Google 上搜索了示例,但我找不到与我的情况相关的任何内容。

【问题讨论】:

我建议您使用分隔符,例如 , 或空格来分隔文本文件中的数据(用于单个用户的信息)。然后使用新行分隔每个用户的条目。 不错!我实际上正在考虑这样做,但不确定。 那么你就可以在scanner类中使用useDelimiter()方法了。 【参考方案1】:

要使用 FileInputStream 读取文件,只需使用:

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

使用Scanner的方法读取

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()

【讨论】:

好的,我明白你在做什么。但是我如何将这些分配给适当的变量呢?例如,将 ID# 分配给 ID 变量,将名称分配给 name 变量等等? 在从文本文件中读回数据时,您很可能会创建 Item 的新实例,将从文本文件中检索到的值传入构造函数或使用适当的设置器方法。 好吧,你可以说 new Item(input.nextInt(), input.next(), input.next(), input.nextInt(), input.nextDouble());但是要做到这一点,您应该确保文本文件中的每个项目都在单独的行上,并且每个数据都按照构造函数的正确顺序(或使构造函数与文本文件中的数据顺序相同)

以上是关于Java Inventory - 如何使用 FileInputStream 读取文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写yaml格式的Ansible主机清单(inventory)及清单变量使用Demo

如何通过枚举使用 Inventory UI 按钮

使用ansible API打印主机列表

在“inventory_hostname”时使主机组成为变量的语法是什么?

如何使用审计命令语言 (ACL) 从另一个项目导入 .fil 文件?

3,Ansible---动态Inventory