Написать циклы по созданию файлов Java

Всем здравствуйте, написал такой код, не могу придумать как оформить его в циклы. По заданию он во всех вложенных рандомных директориях, должен создавать три файла. Заранее спасибо.

public static void main(String[] args) throws Exception {
    int min = (int) Math.ceil(1);
    int max = (int) Math.floor(3);
    int q = (int) (Math.floor(Math.random() * (max - min + 1)) + min);

    if (q == 1) {
        File Dir = new File("C://SE2020_LESSON9/Directory_1/");
        Dir.mkdirs();
        square();
        square_1();

    } else if (q == 2) {
        File Dir = new File("C://SE2020_LESSON9/Directory_1/Directory_2");
        Dir.mkdirs();
        square();
        square_1();
        square_2();
    } else if (q == 3) {
        File Dir = new File("C://SE2020_LESSON9/Directory_1/Directory_2/Directory_3");
        Dir.mkdirs();
        square();
        square_1();
        square_2();
        square_3();
    }




}


public static void square() {


    for (int i = 1; i < 4; i++) {
        int minKol = (int) Math.ceil(10);
        int maxKol = (int) Math.floor(200);
        int b = (int) (Math.floor(Math.random() * (maxKol - minKol + 1)) + minKol);

        try (Writer writer = new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream("C://SE2020_LESSON9/filename_" + i + ".txt"), "utf-8")))
        {
            for (int j = 10; j < b; j++) {
                int a = (int) (Math.random() * 10);
                String s = Integer.toString(a);
                writer.write(" " + s);
            }
        }
        catch(IOException e) {
            System.out.println(e.getMessage());
        }

    }
}
public static void square_1() {


    for (int i = 1; i < 4; i++) {
        int minKol = (int) Math.ceil(10);
        int maxKol = (int) Math.floor(200);
        int b = (int) (Math.floor(Math.random() * (maxKol - minKol + 1)) + minKol);

        try (Writer writer = new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream("C://SE2020_LESSON9/Directory_1/filename_" + i + ".txt"), "utf-8")))
        {
            for (int j = 10; j < b; j++) {
                int a = (int) (Math.random() * 10);
                String s = Integer.toString(a);
                writer.write(" " + s);
            }
        }
        catch(IOException e) {
            System.out.println(e.getMessage());
        }

    }
}
public static void square_2() {


    for (int i = 1; i < 4; i++) {
        int minKol = (int) Math.ceil(10);
        int maxKol = (int) Math.floor(200);
        int b = (int) (Math.floor(Math.random() * (maxKol - minKol + 1)) + minKol);

        try (Writer writer = new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream("C://SE2020_LESSON9/Directory_1/Directory_2/filename_" + i + ".txt"), "utf-8")))
        {
            for (int j = 10; j < b; j++) {
                int a = (int) (Math.random() * 10);
                String s = Integer.toString(a);
                writer.write(" " + s);
            }
        }
        catch(IOException e) {
            System.out.println(e.getMessage());
        }

    }
}
public static void square_3() {


    for (int i = 1; i < 4; i++) {
        int minKol = (int) Math.ceil(10);
        int maxKol = (int) Math.floor(200);
        int b = (int) (Math.floor(Math.random() * (maxKol - minKol + 1)) + minKol);

        try (Writer writer = new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream("C://SE2020_LESSON9/Directory_1/Directory_2/Directory_3/filename_" + i + ".txt"), "utf-8")))
        {
            for (int j = 10; j < b; j++) {
                int a = (int) (Math.random() * 10);
                String s = Integer.toString(a);
                writer.write(" " + s);
            }
        }
        catch(IOException e) {
            System.out.println(e.getMessage());
        }

    }
}

Ответы (1 шт):

Автор решения: Дмитрий

Вы никогда не слышали про дублирование кода, про KISS? А зачем вы так сложно генерируете рандом в заданном диапазоне? Любой запрос в гугл выдаст сотни результатов, как это сделать на много проще. Главная задача - сделать код максимально читаемым, в противном случае вы очень скоро просто перестанете понимать, что происходит.

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Random;
import java.util.stream.Collectors;

public class Test {

    private final static Random RANDOM = new Random();

    public static void main(String[] args) throws IOException {
        
        String[] fileNames = {"C://SE2020_LESSON9/filename_", "C://SE2020_LESSON9/Directory_1/filename_",
            "C://SE2020_LESSON9/Directory_1/Directory_2/filename_", "C://SE2020_LESSON9/Directory_1/Directory_2/Directory_3/filename_"};
        String[] dirNames = {"C://SE2020_LESSON9/", "C://SE2020_LESSON9/Directory_1/",
            "C://SE2020_LESSON9/Directory_1/Directory_2", "C://SE2020_LESSON9/Directory_1/Directory_2/Directory_3"};
        
        int randomRange = random(1, 3);
        for (int i = 0; i < randomRange; i++) new File(dirNames[i]).mkdirs();
        for (int i = 0; i < randomRange; i++) square(fileNames[i]);
    }
    
    private static void square(String fileName) throws IOException {
        for (int i = 1; i < 4; i++) {
            byte[] content = RANDOM.ints(random(10, 200), 0, 9)
                    .mapToObj(String::valueOf)
                    .collect(Collectors.joining(" ")).getBytes();
            Files.write(Paths.get(fileName + i + ".txt"), content);
        }
    }
    
    private static int random(int min, int max) {
        return RANDOM.nextInt(max-min+1)+min;
    }
    
}

Задача решается довольно просто, потому как задача достаточно тривиальная. Этот код работает корректно. Но вы, в свою очередь, попробуйте сделать генератор имен файлов и названий каталогов (потому как сейчас это просто 2 массива). Напишите специальный метод, принимающий базовый путь (C://SE2020_LESSON9) и число - количество вложенных каталогов, а уже этот метод будет генерировать полные имена файлов и каталогов. Задача несложная, но в качестве практики сгодится. Пробуйте, удачи.

→ Ссылка