首页 > 解决方案 > Java - 嵌套 For 循环 - 为每个 System.out.println 附加到文件的更好方法

问题描述

我正在使用下面的代码来生成一些完成工作的测试数据。这里没有问题。

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

class GenerateTestData {
    public static void main(String[] args) throws IOException {
        File outfile = new File("dbscript_output.sql");

        if (outfile.exists()) {
            outfile.delete();
        }
        int totalCluster = 2;
        int totalAgency = totalCluster * 10;
        int totalProgramArea = totalAgency * 20;
        int totalUsers = totalProgramArea * 100;

        for (int numCluster = 1; numCluster <= totalCluster; ++numCluster) {
            System.out.println("\nCluster__________________________" + numCluster);
            
            writeToFile("Cluster__________________________" + numCluster);
            for (int numAgency = 1; numAgency <= totalAgency; ++numAgency) {
                System.out.println("\n\tCluster_" + numCluster + "_Agency_" + numAgency);
                
                writeToFile("\n\tCluster_" + numCluster + "_Agency_" + numAgency);
                for (int numProgramArea = 1; numProgramArea <= totalProgramArea; ++numProgramArea) {
                    System.out.println("\n\t\tAgency_" + numAgency + "_ProgramArea_" + numProgramArea);
                    
                    writeToFile("\n\t\tAgency_" + numAgency + "_ProgramArea_" + numProgramArea);
                    for (int numUser = 1; numUser <= totalUsers; ++numUser) {
                        System.out.println("\n\t\t\tAgency_" + numAgency + "_" + "ProgramArea_" + numProgramArea
                                + "_User_" + numUser);
                        
                        writeToFile("\n\t\t\tAgency_" + numAgency + "_" + "ProgramArea_" + numProgramArea
                                + "_User_" + numUser);
                    }
                }
            }
        }
    }

    private static void writeToFile(String data) throws IOException {
        File file = new File("dbscript_output.sql");
        FileWriter fr = new FileWriter(file, true);
        BufferedWriter br = new BufferedWriter(fr);
        br.write(data);
        br.close();
        fr.close();
    }
}

问题:有没有更好的方法来实现它?Java 7/8/11 有更好的 API 吗?我对使用 Java 的任何更短/更智能的方式持开放态度。此处显示的示例只是几个元素。我有 16 个实体,我必须为其准备测试数据,并且它们都是连接的(相关的)。谢谢。

更新

请允许我重新提出这个问题。

使用纯 Core Java 1.8+ 是否有任何更短/更智能的方法来实现上述目标?我可以在哪里加入(合并)“for”循环和“writeToFile”?(可能在一个班轮中?)感谢大家的帮助。

标签: java

解决方案


正如我们上面提到的同事,您可以使用以下资源尝试(因此您不必关闭每个输入流)。您还可以缩短/更改带有流的嵌套 for 循环,但这不是更清晰的解决方案,您必须对其进行改进。

public class GenerateTestData {
public static void main(String[] args) throws IOException {
    File outfile = new File("dbscript_output2.sql");

    if (outfile.exists()) {
        outfile.delete();
    }
    int totalCluster = 2;
    int totalAgency = totalCluster * 10;
    int totalProgramArea = totalAgency * 20;
    int totalUsers = totalProgramArea * 100;


    IntStream.range(0, totalCluster).forEach(numCluster->{
        writeToFile("Cluster__________________________" + numCluster);
        IntStream.range(0, totalAgency).forEach(numAgency->{
            writeToFile("\n\tCluster_" + numCluster + "_Agency_" + numAgency);
            IntStream.range(0, totalProgramArea).forEach(numProgramArea->
                    IntStream.range(0,totalUsers).forEach(numUser->{
                        writeToFile("\n\t\t\tAgency_" + numAgency + "_" + "ProgramArea_" + numProgramArea
                                + "_User_" + numUser);
                    }));
        });
    });
}

private static void writeToFile(String data) {
    File file = new File("dbscript_output2.sql");
    try(FileWriter fr = new FileWriter(file, true);
        BufferedWriter br = new BufferedWriter(fr)) {
        br.write(data);
        System.out.println(data);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

推荐阅读