更新文本文件的逻辑问题 - Java
Logic issue to update text file - Java
我在通过用户输入更新文本文件时遇到逻辑问题。
我有一个包含产品信息(ID;名称;成本;库存)的文本文件:
001;Hand Soap;2.00;500
为了添加产品,用户调用函数 addProduct 以便在产品名称已存在于文件中时更新产品,或者在产品名称尚不存在时附加到文本文件。我不确定两件事:如何只追加一次(目前它为它读取的每一行追加..)以及如何处理空文本文件。
addProduct 的外观如下:
public void addProduct(Product product, int amountReceived) throws FileNotFoundException, IOException {
newProduct = product;
String productParams = newProduct.getProduct();
String productID = newProduct.getProductID();
int productStock = newProduct.getProductStock();
String productName = newProduct.getProductName();
String tempFileName = "tempFile.txt";
System.out.println("Attempting to Add Product : " + newProduct.getProduct());
BufferedReader br = null;
BufferedWriter bw = null;
try {
FileInputStream fstream = new FileInputStream(ProductMap.productFile);
br = new BufferedReader(new InputStreamReader(fstream));
String line;
StringBuilder fileContent = new StringBuilder();
while ((line = br.readLine()) != null) {
System.out.println("Line : " + line);
String [] productInfo = line.split(";");
System.out.println("Added Product Info length : " + productInfo.length);
if (productInfo.length > 0) {
if (productInfo[1].equals(productName))
{
System.out.println("Adding existing product");
System.out.println("Product Info : " + String.valueOf(productInfo[3]));
//line = line.replace(String.valueOf(productInfo), String.valueOf(productStock - amountSold));
productInfo[3] = String.valueOf(Integer.parseInt(productInfo[3]) + amountReceived);
String newLine = productInfo[0] + ";" + productInfo[1] + ";" + productInfo[2] + ";" + productInfo[3];
fileContent.append(newLine);
fileContent.append("\n");
System.out.println("Updated Product Info : " + String.valueOf(Integer.parseInt(productInfo[3]) + amountReceived));
System.out.println("Line :" + newLine);
} else {
fileContent.append(line);
fileContent.append("\n");
fileContent.append(productParams);
fileContent.append("\n");
//fileContent.append(productParams + "\n");
//System.out.println("Product Name : " + productInfo[1]);
//System.out.println("The full product info : " +productParams);
}
}
br.readLine();
}
if (br.readLine() == null) {
fileContent.append(productParams);
}
System.out.println("Product Updated File Contents : " + fileContent);
FileWriter fstreamWrite = new FileWriter(ProductMap.productFile);
BufferedWriter out = new BufferedWriter(fstreamWrite);
System.out.println("File Content : " + fileContent);
out.write(fileContent.toString());
out.close();
in.close();
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
在高层次上,简单的文本文件可能不是这种用途的最佳选择。此实现需要足够的内存来保存整个文件。
如果你只有添加并且可以直接附加到文件,事情会更容易。数据库似乎是最好的选择。在数据库和简单文本文件之间的某个地方,如果数据可以用每个字段的标准长度写入,RandomAccessFile 可能会有所帮助。然后您可以覆盖特定行,而不必重写整个文件。
鉴于当前设置的限制,我想不出每次更新文件时都写入所有数据的方法。
为了解决空文件问题,可以跳过当前循环的else条件,这样新数据就不会添加到fileContent StringBuffer中。然后在写回数据时,您可以在文件的其他信息之前或之后写入新数据。
此外,不需要循环底部的 readLine。在循环底部读取的任何行都将被跳过,当循环顶部读取到下一行时不会真正处理。
我在通过用户输入更新文本文件时遇到逻辑问题。
我有一个包含产品信息(ID;名称;成本;库存)的文本文件:
001;Hand Soap;2.00;500
为了添加产品,用户调用函数 addProduct 以便在产品名称已存在于文件中时更新产品,或者在产品名称尚不存在时附加到文本文件。我不确定两件事:如何只追加一次(目前它为它读取的每一行追加..)以及如何处理空文本文件。
addProduct 的外观如下:
public void addProduct(Product product, int amountReceived) throws FileNotFoundException, IOException {
newProduct = product;
String productParams = newProduct.getProduct();
String productID = newProduct.getProductID();
int productStock = newProduct.getProductStock();
String productName = newProduct.getProductName();
String tempFileName = "tempFile.txt";
System.out.println("Attempting to Add Product : " + newProduct.getProduct());
BufferedReader br = null;
BufferedWriter bw = null;
try {
FileInputStream fstream = new FileInputStream(ProductMap.productFile);
br = new BufferedReader(new InputStreamReader(fstream));
String line;
StringBuilder fileContent = new StringBuilder();
while ((line = br.readLine()) != null) {
System.out.println("Line : " + line);
String [] productInfo = line.split(";");
System.out.println("Added Product Info length : " + productInfo.length);
if (productInfo.length > 0) {
if (productInfo[1].equals(productName))
{
System.out.println("Adding existing product");
System.out.println("Product Info : " + String.valueOf(productInfo[3]));
//line = line.replace(String.valueOf(productInfo), String.valueOf(productStock - amountSold));
productInfo[3] = String.valueOf(Integer.parseInt(productInfo[3]) + amountReceived);
String newLine = productInfo[0] + ";" + productInfo[1] + ";" + productInfo[2] + ";" + productInfo[3];
fileContent.append(newLine);
fileContent.append("\n");
System.out.println("Updated Product Info : " + String.valueOf(Integer.parseInt(productInfo[3]) + amountReceived));
System.out.println("Line :" + newLine);
} else {
fileContent.append(line);
fileContent.append("\n");
fileContent.append(productParams);
fileContent.append("\n");
//fileContent.append(productParams + "\n");
//System.out.println("Product Name : " + productInfo[1]);
//System.out.println("The full product info : " +productParams);
}
}
br.readLine();
}
if (br.readLine() == null) {
fileContent.append(productParams);
}
System.out.println("Product Updated File Contents : " + fileContent);
FileWriter fstreamWrite = new FileWriter(ProductMap.productFile);
BufferedWriter out = new BufferedWriter(fstreamWrite);
System.out.println("File Content : " + fileContent);
out.write(fileContent.toString());
out.close();
in.close();
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
在高层次上,简单的文本文件可能不是这种用途的最佳选择。此实现需要足够的内存来保存整个文件。
如果你只有添加并且可以直接附加到文件,事情会更容易。数据库似乎是最好的选择。在数据库和简单文本文件之间的某个地方,如果数据可以用每个字段的标准长度写入,RandomAccessFile 可能会有所帮助。然后您可以覆盖特定行,而不必重写整个文件。
鉴于当前设置的限制,我想不出每次更新文件时都写入所有数据的方法。
为了解决空文件问题,可以跳过当前循环的else条件,这样新数据就不会添加到fileContent StringBuffer中。然后在写回数据时,您可以在文件的其他信息之前或之后写入新数据。
此外,不需要循环底部的 readLine。在循环底部读取的任何行都将被跳过,当循环顶部读取到下一行时不会真正处理。