2017-09-21 45 views
0

一年前,我爲使用Java的編程類編寫了此代碼。這是一個基本的食品日誌控制檯應用程序,它可以創建一個CSV文件,並且可以在創建後追加用戶的輸入。我遇到了一個我永遠無法解決的問題。我在一段時間內沒有做太多的編程工作,但我很好奇這個解決方案。問題是每次程序運行時,它都會在CSV中插入另一個標題。我只希望它在初始創建時插入,如果文件已經存在,則跳過。我最初的想法是其他if(file.exists()== true){剩餘的代碼塊};在'嘗試'塊中,但它根本不寫頭。程序每次運行時都會將頭文件添加到CSV文件

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

使用調試器來逐步執行代碼,看看它在做什麼。 –

回答

1

這裏有剩餘類:

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

我想從您嘗試確定的方式你的問題莖whethe r實際文件是否存在,然後決定採取哪些操作(寫或不寫)。

在FoodLogApp#主,你創建的每一個它就會運行時間(FoodLog.csv),然後您可以通過FoodLogWriter#writeFoodLog一個新的文件。此文件被創建爲在這一點上的實例變量和存在於JVM的內存,檢查這是否存在不是什麼原因造成的問題(因爲在這一點上,這將始終返回true)。

我建議您嘗試實施一種檢查文件是否以任何方式持續存在的正確方法。也就是說,您需要執行I/O操作來確定文件路徑(fileName變量)中是否存在文件。

這樣做

你的最簡單的方法是用java .nio包。首先使用Paths.get(「file_path」)創建一個Path對象。然後使用Files.exists()來檢查給定路徑中是​​否存在實際文件。

我想這會解決你的問題。等待聽聽它是否奏效。

1

你的問題是在這裏:

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

可變文件取決於你在哪裏執行Java程序(那是因爲你使用的是絕對路徑的相對路徑,而不是)的,文件名不。所以,如果你正在執行在/ home/youruser /,它會工作,但如果你是在另一個文件夾,例如/家庭/ youruser /項目執行/,文件將是「/家/ youruser /項目/FoodLog.csv」。

,我建議你只改變了順序,並使用相同的變量:

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