Смотрел решения других через String.format, я сделал через StringBuilder. Валидатор не принимает такую строку
package com.javarush.task.task18.task1827;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/*
Прайсы
*/
public class Solution {
public static void main(String[] args) throws Exception {
if (args.length==0) return;
if (args[0].equals("-c")) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String fileSource = reader.readLine();
FileReader fileReader = new FileReader(fileSource);
List<Integer> data = new ArrayList<>();
int maxId = 1;
reader = new BufferedReader(fileReader); //начинаем читать источник данных
//добавляем в цикле пока доступен поток первые 8 символов
//каждой строки из файла, обрезая пробелы, а затем преобразуя в число - это наш максимальный id
while (reader.ready()){
String number = reader.readLine().substring(0,8).trim();
data.add(Integer.parseInt(number));
}
if (!data.isEmpty()){
maxId = Collections.max(data)+1;
}
fileReader.close();
FileWriter fileWriter = new FileWriter(fileSource,true);
// через StringBuilder.setLength устанавливаем необходимый размер параметра
//добивая пробелами или обрезая
StringBuilder id = new StringBuilder(String.valueOf(maxId));
id.setLength(8);
StringBuilder productName = new StringBuilder(args[1]);
productName.setLength(30);
StringBuilder price = new StringBuilder(args[2]);
price.setLength(8);
StringBuilder quantity = new StringBuilder(args[3]);
quantity.setLength(4);
String str = "\n" +id + productName + price + quantity;
fileWriter.write(str);
//fileWriter.flush();
fileWriter.close();
}
}
}
Разница в том, что String.format заполняет пропуски кодом 32 (пробел), а в StringBuilder при расширении длины добавляются значения по умолчанию с кодом 0.