Я не понимаю, что ему не нравится? Все потоки закрыты, при тестировании выводит всё согласно условию.
Например при выполнении трёх следующих запусков:
java Main -c шорты чёрные 120 50
java Main -c шорты чёрные для пляжа 400.71 100
java Main -c шорты сиреневые в крапинку для отдыха на пляже 50 10
В файле появлятся следующие три строки(до этого уже было 9 строк, начиная с 0 индекса и заканчивая 8):
9 шорты чёрные 120,00 50
10 шорты чёрные для пляжа 400,71 100
11 шорты сиреневые в крапинку для50,00 10
Сил уже никаких нет. Ладно там что-нибудь неправильно выводится, но потоки-то уж все закрыты.
package com.javarush.task.task18.task1827;
/*
Прайсы
*/
import java.io.IOException;
import java.io.PrintWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Scanner;
public class Solution {
public static void main(String[] args) throws Exception {
Scanner in = new Scanner(System.in);
String fileName = in.nextLine();
in.close();
if (args.length > 4 && args[0].equals("-c")) {
StringBuilder builderOfName = new StringBuilder();
double price = Double.parseDouble(args[args.length - 2]);
int count = Integer.parseInt(args[args.length - 1]);
for (int k = 1; k != args.length - 2; k ++) {
builderOfName.append(args[k]).append(" ");
}
try (PrintWriter fileWriter = new PrintWriter(new FileOutputStream(new File(fileName), true))) {
int len = builderOfName.length();
fileWriter.print("\n");
fileWriter.printf("%-8d", getNewId(fileName));
fileWriter.printf("%-30s", builderOfName.toString().substring(0, 30 <= len ? 30 : len));
fileWriter.printf("%-8.2f", price);
fileWriter.printf("%-4d", count);
}
}
}
public static int getNewId(String fileName) throws IOException { //Метод находит максимальный id, увеличивает
File file = new File(fileName); //его на единицу и возвращает
Scanner in = new Scanner(file);
int max = Integer.MIN_VALUE;
while (in.hasNextLine()) {
String line = in.nextLine();
if (line.isEmpty()) continue;
String strNum = line.substring(0, 8);
int num = Integer.parseInt(strNum.trim());
if (num > max) max = num;
}
in.close();
if (max < 0) return 0;
return max + 1;
}
}