Написать циклы по созданию файлов 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) и число - количество вложенных каталогов, а уже этот метод будет генерировать полные имена файлов и каталогов. Задача несложная, но в качестве практики сгодится. Пробуйте, удачи.