更新文本文件的逻辑问题 - 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。在循环底部读取的任何行都将被跳过,当循环顶部读取到下一行时不会真正处理。