2017-09-21 1 views
0

Java로 프로그래밍 클래스를 작성한 지 1 년이 넘었습니다. CSV 파일을 생성하고 생성 된 사용자의 입력을 추가 할 수있는 기본적인 식품 로그 콘솔 애플리케이션입니다. 나는 결코 해결할 수 없었던 문제에 부딪쳤다. 한동안 프로그래밍을 많이 해본 적은 없지만 솔루션에 대해 궁금합니다. 문제는 프로그램이 실행될 때마다 CSV에 다른 헤더를 삽입한다는 것입니다. 초기 생성시에만 삽입하고, 파일이 이미 있으면 건너 뛸 수 있습니다.프로그램을 실행할 때마다 CSV 파일에 헤더가 추가됩니다.

내 초기 생각은 else if (file.exists() == true) {remaining code block}; 'try'블록에 있지만 헤더를 전혀 쓰지 않습니다.

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 어떤 동작을 취할 지 결정하기 전에 (헤더를 쓰는 지 아닌지) 실제 파일이 있는지 없는지.

FoodLogApp # main에서는 실행될 때마다 새 파일 (FoodLog.csv)을 만들고 FoodLogWriter # writeFoodLog를 전달합니다. 이 파일은이 시점에서 인스턴스 변수로 만들어지고 JVM의 메모리에 존재합니다. 존재하지 않는지 여부를 확인하면 문제가 발생합니다 (이 시점에서 항상 true를 반환하므로).

파일이 어떤 방식 으로든 유지되었는지 여부를 확인하는 적절한 방법을 구현하는 것이 좋습니다. 즉, 주어진 파일 경로 (fileName 변수)에 파일이 존재하는지 판별하기 위해 I/O 조치를 수행해야합니다.

가장 쉬운 방법은 java .nio 패키지를 사용하는 것입니다. 먼저 Paths.get ("file_path")를 사용하여 Path 객체를 만듭니다. 그런 다음 Files.exists()를 사용하여 실제 파일이 지정된 경로에 있는지 확인하십시오.

나는 이것이 당신의 문제를 해결할 것이라고 생각합니다. 작동 여부를 기다리는 중입니다.

1

귀하의 문제는 여기에 있습니다 :

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

변수 파일 어디 당신이 (당신은 절대 경로 대신 상대 경로를 사용하고 있기 때문에 즉) 자바 프로그램을 실행하는의 의존 fileName에하지 . 예를 들어,/home/youruser/project /와 같이 다른 폴더에서 실행하는 경우, 파일은 "/ home/youruser/project"가 될 것입니다 /FoodLog.csv ". 코드를 단계별로 어떤 일이 일어나는지 확인하기 위해 디버거를 사용

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