JAVA无法读取多行文本文件

时间:2018-12-02 03:26:25

标签: java file text

我正在创建一个代码,该代码读取并格式化内部包含食谱的文本文件。

到目前为止,我遇到了2个问题。食谱是这样的:

“ id”:44330
  “美食”:“印度人”
  “成分”:
  “黄油”
  “花生酱”
  “查克”
  “咖喱粉”
  “无盐干烤花生”
  椰子奶
  红糖
  “大蒜”
  “泰国鱼露”
  “土豆”
  牛肉汤
  “洋葱”

我不知道如何使程序读取多行以执行以下输出: id,食谱名称,料理类型,成分1,成分2,成分3,成分4,...,成分n

我为此使用了一个循环,并考虑过将一些内容添加到程序中,以便一旦存储了第一行,就可以转到下一行。但是我不知道该如何添加------所在的位置。

while (currentLine != null) {

        String[] RecipeId = currentLine.split("\\s+");
        String idName = RecipeId[0];
        int id = Integer.valueOf(RecipeId[1]);
        ------
        String cuisineDrop = RecipeId[3];
        String cuisineName = RecipeId[4];
        ------
        String[] ingredients = RecipeId[5];

        recipesFormat.add(new Recipe(idName, id, cuisineDrop, cuisineName, ingredients));
}

我的第二个问题是配料部分将如何工作,因为我需要该程序以阵列的形式存储它具有的配方的任意数量的配料,而且我不知道如何使它读取每种配料并在存储之前将其存储下一个食谱。有帮助吗?

1 个答案:

答案 0 :(得分:0)

您可以使用pojo类(例如Recipe)来实现此目的,该类包含三个成员变量-id,Cuisine和配料的 list

public class Recipe {
    private String id;
    private String cuisine;
    private List<String> ingredients = new ArrayList<>();

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getCuisine() {
        return cuisine;
    }

    public void setCuisine(String cuisine) {
        this.cuisine = cuisine;
    }

    public List<String> getIngredients() {
        return ingredients;
    }

    public void addIngredients(String ingredients) {
        this.ingredients.add(ingredients);
    }
}

现在使用:

public static void main(String[] args) throws FileNotFoundException {
    final String PATH = "recipe.txt";
    Scanner sc = new Scanner(new File(PATH));
    List<Recipe> listOfRecipes = new ArrayList<>();

    String currLine = sc.nextLine();
    while (sc.hasNextLine() && currLine.startsWith("\"id\"")) {
        Recipe recipe = new Recipe();
        recipe.setId(currLine.substring(currLine.indexOf(":") + 2));
        currLine = sc.nextLine();
        recipe.setCuisine(currLine.substring(currLine.indexOf(":")+2).replaceAll("\"",""));
        currLine = sc.nextLine();
        while (sc.hasNextLine()) {      // <--- finding all ingredients
            currLine = sc.nextLine();
            if (currLine.startsWith("\"id\"")) {
                break;
            }
            recipe.addIngredients(currLine.replaceAll("\"", ""));
        }
        listOfRecipes.add(recipe);
    }

    // print all recipes 
    listOfRecipes.forEach(System.out::println); 
}

逻辑:

  1. 在这里,每次遇到新对象时,我们都会创建一个新对象recipe 在文件中用id表示的食谱。
  2. 现在,我们解析每行内容并将其设置为各自属性 上面创建的recipe对象中的一个。
  3. 对于成分列表,我们使用嵌套循环并检查直到 找到下一个ID。如果找到,我们将打破内部循环并继续 否则我们将添加到成分列表中。