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_hostname”时使主机组成为变量的语法是什么?