DkR*_*r12 3 java writefile bufferedreader stringtokenizer readfile
我需要一些帮助:我正在用 Java 进行超市模拟,但我遇到了一个问题,我有一个文本文件 (Stock.txt),其中包含所有超市库存,例如:
其中第一个数字是产品的“id”,其次是产品所属的部门,第三个是产品名称,接下来是价格,最后一个数字是该产品的库存数量. 我有这门课:
public class Product {
protected String name;
protected double price;
protected String department;
protected int id;
protected int stock;
}
Run Code Online (Sandbox Code Playgroud)
所以,基本上我需要做的是从文本文件中读取每一行并创建产品,即对于第一行,做这样的事情:
Product product1 = new Product(0,"Bakery","Chocolate Cake", 12.5, 250);
Run Code Online (Sandbox Code Playgroud)
然后将其添加到数组中
Product[0] = product1;
Run Code Online (Sandbox Code Playgroud)
对于文本文件中的所有内容,当运行模拟时,每个客户将购买随机数量的库存随机产品,因此库存数量将减少。最后,当模拟结束时,程序必须在同一个文本文件中写入每个产品的修改数量。
问题是这可能太容易了,但我不知道如何做到这一点,因为自从我开始用 Java 编程(我是初学者)以来,用 Java 读取和写入文件对我来说一直是一个真正的问题。我有一些使用 BufferedReader 和 StringTokenizer 类来读取和创建对象问题的想法,但我不知道如何去做,我也不知道我必须如何做覆盖问题。我真的很感激你的帮助!
哦!顺便说一句,我真的只需要使用数组,所以使用 ArrayList 或任何其他结构甚至都不是一个选择:(
为了简单起见,我将所有项目定义为字符串。
产品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
Run Code Online (Sandbox Code Playgroud)
将您的产品列表放入“testData/product.txt”中。这是假设您的产品列表采用相同的格式,即 id-department-name-price-stock \n。
使用下面的 jUnit 测试来测试您的代码。您当然可以修改读取product.txt 文件的方式(可能是其他强大的字符串读取器)。
@Test
public void test() {
try {
List<String> productLines = Files.readAllLines(java.nio.file.Paths.get("./testData/product.txt"), StandardCharsets.UTF_8);
for (String line: productLines)
Product product = new Product();
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这是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);
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
54477 次 |
| 最近记录: |