2016-04-28 6 views
0

Ich habe ein logisches Problem, um eine Textdatei über Benutzereingaben zu aktualisieren.Logikproblem zur Aktualisierung der Textdatei - Java

Ich habe eine Textdatei mit Produktinformationen (ID, Name, Kosten, Lager):

001;Hand Soap;2.00;500 

Um ein Produkt der Benutzer ruft eine Funktion addProduct, um entweder zu aktualisieren, ein Produkt, wenn der hinzufügen Produktname existiert bereits in der Datei oder hängt an die Textdatei an, falls sie noch nicht existiert. Ich bin mir nicht sicher über zwei Dinge: wie man nur einmal anhängen (für den Moment hängt es für jede Zeile, die es liest ..) und wie man mit einer leeren Textdatei umgehen. Diese

ist, wie addProduct aussieht:

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()); 
    } 
} 

Antwort

0

Auf hohem Niveau, eine einfache Textdatei nicht die beste Wahl für diese Anwendung sein kann. Diese Implementierung benötigt ausreichend Speicher für die gesamte Datei.

Wenn Sie nur Ergänzungen hatten und direkt an die Datei anhängen könnten, wäre es einfacher. Eine Datenbank scheint die beste Wahl zu sein. Irgendwo zwischen einer Datenbank und einer einfachen Textdatei könnte ein RandomAccessFile helfen, wenn die Daten mit Standardlängen für jedes Feld geschrieben werden könnten. Dann könnten Sie eine bestimmte Zeile überschreiben, anstatt die gesamte Datei neu schreiben zu müssen.

Angesichts der Einschränkungen der aktuellen Einrichtung, kann ich mir nicht vorstellen, jedes Mal, wenn die Datei aktualisiert wird, alle Daten zu schreiben.

Um das Problem der leeren Datei zu umgehen, könnten Sie die else-Bedingung der aktuellen Schleife überspringen, damit die neuen Daten nicht zum fileContent StringBuffer hinzugefügt werden. Wenn Sie dann die Daten zurückschreiben, können Sie entweder die neuen Daten vor oder nach den anderen Informationen aus der Datei schreiben.

Auch die readLine am Ende der Schleife wird nicht benötigt. Jede Zeile, die am Ende der Schleife gelesen wird, wird übersprungen und nicht wirklich verarbeitet, wenn das Lesen am Anfang der Schleife die nächste Zeile erhält.