2017-09-21 4 views
0

Ich schrieb diesen Code vor über einem Jahr für eine Programmierklasse mit Java. Es handelt sich um eine Basic-Food-Log-Konsolenanwendung, die eine CSV-Datei erstellt und nach dem Erstellen Eingaben an den Benutzer anhängen kann. Ich stieß auf ein Problem, das ich nie lösen konnte. Ich habe seit einiger Zeit nicht viel mit Programmierung gemacht, aber ich bin neugierig auf die Lösung. Das Problem ist, dass jedes Mal, wenn das Programm ausgeführt wird, eine weitere Kopfzeile in die CSV-Datei eingefügt wird. Ich möchte nur, dass es bei der anfänglichen Erstellung eingefügt wird, und wenn die Datei bereits vorhanden ist, zu überspringen.Programm fügt Header zu CSV-Datei jedes Mal

Mein erster Gedanke war ein else if (File.Exists() == true) {verbleibenden Codeblock}; im 'try' Block, aber es schreibt überhaupt nicht den Header.

import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Scanner; 

public class FoodLogWriter { 

private static final String COMMA_DELIMITER = ","; 
private static final String NEW_LINE_SEPARATOR = "\n"; 
private static final String FILE_HEADER = "Date,Food Time,Food Item,Calories,Carbohydrates,Sugar,Protein,Fiber,Total Fat"; 
private static Scanner kb; 

public static void writeFoodLog(String fileName, File file) throws IOException { 

    List<FoodLog> list = new ArrayList<FoodLog>(); 
    FoodLogApp app = new FoodLogApp(); 

    kb = new Scanner(System.in); 
    String Dinput; 
    String FTinput; 
    String FIinput; 
    double CALinput; 
    double CARBinput; 
    double Sinput; 
    double Pinput; 
    double TFinput; 
    double Finput; 

    int i = 0; 

    while (i < 1000) { 

     System.out.print("Enter the date: "); 
     Dinput = kb.next(); 

     System.out.print("Enter the food time: "); 
     FTinput = kb.next(); 

     System.out.print("Enter the food item: "); 
     FIinput = kb.next(); 

     System.out.print("Enter the calories: "); 
     CALinput = kb.nextDouble(); 

     System.out.print("Enter the carbohydrates: "); 
     CARBinput = kb.nextDouble(); 

     System.out.print("Enter the sugar: "); 
     Sinput = kb.nextDouble(); 

     System.out.print("Enter the protein: "); 
     Pinput = kb.nextDouble(); 

     System.out.print("Enter the fiber: "); 
     Finput = kb.nextDouble(); 

     System.out.print("Enter the total fat: "); 
     TFinput = kb.nextDouble(); 

     list.add(app.createFoodLog(Dinput, FTinput, FIinput, CALinput, CARBinput, Sinput, Pinput, Finput, TFinput)); 

     System.out.println(""); 
     System.out.print("Do you have another item to input? "); 
     String response = kb.next(); 
     System.out.println(""); 

     if (response.equalsIgnoreCase("no")) { 

      app.printFoodLog(list); 
      break; 

     } else { 
      i++; 
     } 

     kb.nextLine(); 

    } 

    FileWriter fileWriter = null; 

    try { 

     fileWriter = new FileWriter(fileName, true); 

     if (file.exists() == false) { 
      fileWriter.write(FILE_HEADER.toString()); 
     } 
     fileWriter.append(NEW_LINE_SEPARATOR); 

     for (FoodLog FL : list) { 
      fileWriter.append(String.valueOf(FL.getDate())); 
      fileWriter.append(COMMA_DELIMITER); 
      fileWriter.append(String.valueOf(FL.getFoodTime())); 
      fileWriter.append(COMMA_DELIMITER); 
      fileWriter.append(String.valueOf(FL.getFoodItem())); 
      fileWriter.append(COMMA_DELIMITER); 
      fileWriter.append(String.valueOf(FL.getCalories())); 
      fileWriter.append(COMMA_DELIMITER); 
      fileWriter.append(String.valueOf(FL.getCarbohydrates())); 
      fileWriter.append(COMMA_DELIMITER); 
      fileWriter.append(String.valueOf(FL.getSugar())); 
      fileWriter.append(COMMA_DELIMITER); 
      fileWriter.append(String.valueOf(FL.getProtein())); 
      fileWriter.append(COMMA_DELIMITER); 
      fileWriter.append(String.valueOf(FL.getFiber())); 
      fileWriter.append(COMMA_DELIMITER); 
      fileWriter.append(String.valueOf(FL.getTotalFat())); 
      fileWriter.append(NEW_LINE_SEPARATOR); 
     } 

     System.out.println("CSV file was created successfully."); 

    } catch (Exception e) { 
     System.out.println("Error in FoodLogWriter."); 
     e.printStackTrace(); 
    } finally { 

     try { 
      fileWriter.flush(); 
      fileWriter.close(); 
     } catch (IOException e) { 
      System.out.println("Error while flushing/closing file writer."); 
      e.printStackTrace(); 
     } 
    } 

} 

}

+0

den Debugger verwenden, um den Code zu Schritt und sehen, was es tut. –

Antwort

1

Hier sind die übrigen Klassen:

public class FoodLog { 

private String Date; 
private String FoodTime; 
private String FoodItem; 
private double Calories; 
private double Carbohydrates; 
private double Sugar; 
private double Fiber; 
private double Protein; 
private double TotalFat; 

public FoodLog(String Date, String FoodTime, String FoodItem, double Calories, double Carbohydrates, double Sugar, 
     double Fiber, double Protein, double TotalFat) { 

    // super(); 
    this.Date = Date; 
    this.FoodTime = FoodTime; 
    this.FoodItem = FoodItem; 
    this.Calories = Calories; 
    this.Carbohydrates = Carbohydrates; 
    this.Sugar = Sugar; 
    this.Fiber = Fiber; 
    this.Protein = Protein; 
    this.TotalFat = TotalFat; 

} 

public String getDate() { 
    return Date; 
} 

public void setDate(String date) { 
    Date = date; 
} 

public String getFoodTime() { 
    return FoodTime; 
} 

public void setFoodTime(String foodTime) { 
    FoodTime = foodTime; 
} 

public String getFoodItem() { 
    return FoodItem; 
} 

public void setFoodItem(String foodItem) { 
    FoodItem = foodItem; 
} 

public double getCalories() { 
    return Calories; 
} 

public void setCalories(double calories) { 
    Calories = calories; 
} 

public double getCarbohydrates() { 
    return Carbohydrates; 
} 

public void setCarbohydrates(double carbohydrates) { 
    Carbohydrates = carbohydrates; 
} 

public double getSugar() { 
    return Sugar; 
} 

public void setSugar(double sugar) { 
    Sugar = sugar; 
} 

public double getFiber() { 
    return Fiber; 
} 

public void setFiber(double fiber) { 
    Fiber = fiber; 
} 

public double getProtein() { 
    return Protein; 
} 

public void setProtein(double protein) { 
    Protein = protein; 
} 

public double getTotalFat() { 
    return TotalFat; 
} 

public void setTotalFat(double totalFat) { 
    TotalFat = totalFat; 
} 

public String toString() { 
    return "FoodLog [Date = " + Date + ", Food Time = " + FoodTime + ", Food Item = " + FoodItem + ", Calories = " 
      + Calories + ", Carbohydrates = " + Carbohydrates + ", Sugar = " + Sugar + ", Fiber = " + Fiber 
      + ", Protein = " + Protein + ", Total Fat = " + TotalFat + "]"; 

} 

}

import java.io.File; 
import java.io.IOException; 
import java.util.List; 

public class FoodLogApp { 

public static void main(String[] args) throws IOException { 

    File file = new File("FoodLog.csv"); 
    String fileName = System.getProperty("user.home") + "/FoodLog.csv"; 
    FoodLogWriter.writeFoodLog(fileName, file); 

} 

public FoodLog createFoodLog(String Date, String FoodTime, String FoodItem, double Calories, double Carbohydrates, 
     double Sugar, double Fiber, double Protein, double TotalFat) { 

    return new FoodLog(Date, FoodTime, FoodItem, Calories, Carbohydrates, Sugar, Fiber, Protein, TotalFat); 
} 

public void printFoodLog(List<FoodLog> list) { 

    for (FoodLog FL : list) { 

     System.out.println("==========================================="); 
     System.out.println("Food Time : " + FL.getFoodTime()); 
     System.out.println("Food Item : " + FL.getFoodItem()); 
     System.out.println("Calories : " + FL.getCalories()); 
     System.out.println("Carbohydrates : " + FL.getCarbohydrates()); 
     System.out.println("Sugar : " + FL.getSugar()); 
     System.out.println("Protein : " + FL.getProtein()); 
     System.out.println("Fiber : " + FL.getFiber()); 
     System.out.println("Total Fat : " + FL.getTotalFat()); 
     System.out.println("==========================================="); 
     System.out.println("");   
    } 

} 

}

1

Ich denke, Ihr Problem aus dem Weg Stielen Sie versuchen zu bestimmen, whe r Die tatsächliche Datei existiert oder nicht, bevor Sie entscheiden, welche Aktionen Sie ausführen möchten (schreiben Sie den Header oder nicht).

In FoodLogApp # main erstellen Sie eine neue Datei jedes Mal ausgeführt wird (FoodLog.csv), die Sie dann FoodLogWriter # writeFoodLog passieren. Diese Datei wird zu diesem Zeitpunkt als Instanzvariable erstellt und befindet sich im Speicher der JVM. Dabei wird geprüft, ob diese nicht vorhanden ist, was Ihre Probleme verursacht (da dies zu diesem Zeitpunkt immer zu True zurückkehrt).

Ich würde vorschlagen, dass Sie versuchen, eine richtige Art und Weise der Überprüfung, ob eine Datei in irgendeiner Weise beibehalten wurde implementiert. Das heißt, Sie müssen eine E/A-Aktion ausführen, um festzustellen, ob eine Datei in Ihrem angegebenen Dateipfad vorhanden ist (DateiName-Variable).

Ihr einfachste Weg, dies zu tun wäre Java zu verwenden .nio Paket. Beginnen Sie mit dem Erstellen eines Path-Objekts mit Paths.get ("file_path"). Verwenden Sie dann Files.exists(), um zu überprüfen, ob eine tatsächliche Datei im angegebenen Pfad vorhanden ist.

Ich nehme an, dies würde Ihr Problem lösen. Wartet, ob es funktioniert oder nicht.

1

Ihr Problem ist hier:

File file = new File("FoodLog.csv"); 
String fileName = System.getProperty("user.home") + "/FoodLog.csv"; 

Variable Datei hängt von dem Sie das Java-Programm ausgeführt werden (das ist, weil Sie einen relativen Pfad verwenden anstelle eines absoluten Pfad), filename nicht . Also, wenn Sie die Ausführung in/home/youruser /, es wird funktionieren, aber wenn Sie in einem anderen Ordner wie zum Beispiel/home/youruser/Projekt ausgeführt werden /, Datei wird „/ home/youruser/Projekt sein /FoodLog.csv ".

Ich empfehle Ihnen, nur die Reihenfolge zu ändern und die gleiche Variable verwenden:

String fileName = System.getProperty("user.home") + "/FoodLog.csv"; 
File file = new File(fileName);