从文本文件中读取数据并创建对象

我需要一些帮助:我正在使用Java进行超市模拟,但我有一个问题,我有一个文本文件(Stock.txt),其中我有所有的超市库存,例如:

  • 0-Bakery-Chocolate Cake- $ 12.5-250
  • 1-Meat-Premium Steak- $ 2.6-120
  • 2-Seafood-Tuna – 1.2-14美元

如果第一个数字是产品的“id”,则下一个是产品所属的部门,第三个是产品的名称,下一个是价格,最后一个数字是产品有多少件产品。 我有这堂课:

public class Product { protected String name; protected double price; protected String department; protected int id; protected int stock; } 

所以,基本上我需要做的是从文本文件中读取每一行并创建产品,即第一行产生如下内容:

 Product product1 = new Product(0,"Bakery","Chocolate Cake", 12.5, 250); 

然后将其添加到数组中

 Product[0] = product1; 

对于文本文件中的所有内容,然后,在运行模拟时,每个客户将购买随机数量的库存随机产品,因此库存数量将减少。 最后,当模拟结束时,程序必须在同一文本文件中写入每个产品的修改数量。

问题是,这可能太容易了,但我不知道如何做到这一点,因为自从我开始用Java编程(我是初学者)以来,用Java读写文件对我来说是一个真正的问题。 我有一些使用BufferedReader和StringTokenizer类来读取和创建对象问题的想法,但我无法弄明白该怎么做,而且我不知道如何进行覆盖问题。 我真的很感谢你的帮助!

哦! 顺便说一句,我真的只需要使用数组,所以使用ArrayList或任何其他结构,它甚至不是一个选择:(

这对于Scanner读取数据来说是一个很好的工作。 至于无法使用像ArrayList这样的集合,您必须自己动态地重新分配数组。

请尝试以下方法:

 public static void main(String[] args) throws FileNotFoundException { Scanner input = new Scanner(new File("Stock.txt")); input.useDelimiter("-|\n"); Product[] products = new Product[0]; while(input.hasNext()) { int id = input.nextInt(); String department = input.next(); String name = input.next(); double price = Double.valueOf(input.next().substring(1)); int stock = input.nextInt(); Product newProduct = new Product(name, price, department, id, stock); products = addProduct(products, newProduct); } for (Product product : products) { System.out.println(product); } } private static Product[] addProduct(Product[] products, Product productToAdd) { Product[] newProducts = new Product[products.length + 1]; System.arraycopy(products, 0, newProducts, 0, products.length); newProducts[newProducts.length - 1] = productToAdd; return newProducts; } public static class Product { protected String name; protected double price; protected String department; protected int id; protected int stock; private static NumberFormat formatter = new DecimalFormat("#0.00"); public Product(String n, double p, String d, int i, int s) { name = n; price = p; department = d; id = i; stock = s; } @Override public String toString() { return String.format("ID: %d\r\nDepartment: %s\r\nName: %s\r\nPrice: %s\r\nStock: %d\r\n", id, department, name, formatter.format(price), stock); } } 

结果:

 ID: 0 Department: Bakery Name: Chocolate Cake Price: 12.50 Stock: 250 ID: 1 Department: Meat Name: Premium Steak Price: 2.60 Stock: 120 ID: 2 Department: Seafood Name: Tuna Price: 1.20 Stock: 14 

为简单起见,我已将所有项目定义为String。

产品DAO:

 public class Product { private String name; private String price; private String department; private String id; private String stock; //generate `enter code here` //getters & setters //toString 

将您的产品列表放在“testData / product.txt”中。 这假设您的产品列表采用相同的格式,即id-department-name-price-stock \ n。

使用下面的jUnit测试来测试您的代码。 您当然可以修改您阅读product.txt文件的方式(可能是其他强大的字符串阅读器)。

 @Test public void test() { Product product = new Product(); try { List productLines = Files.readAllLines(java.nio.file.Paths.get("./testData/product.txt"), StandardCharsets.UTF_8); for (String line: productLines){ String[] tokens = line.split("-"); product.setId(tokens[0]); product.setDepartment(tokens[1]); product.setName(tokens[2]); product.setPrice(tokens[3]); product.setStock(tokens[4]); } System.out.println(product.toString()); } catch (IOException e) { e.printStackTrace(); } }