1) поможет ли изменение считывания/записи файла на FileReader/FileWriter? (возможно это даже проще из-за того что можно считывать строками и сразу символы)
2) Понимаю что для оптимизации кода нужно использовать String.format() для обрезания/добавления пробелов в строке. возможно поэтому не проходит по пункту (Форматирование новой строки товара должно четко совпадать с указанным в задании.). ТАК ЛИ ЭТО?
3) что не так с id? логически можно понять что исходя из условия в таблице в самой последней строке будет находиться максимальный ID. неужели мне нужно заводить отдельный лист и записывать каждый ID и искать в нем максимальный?
4) ну и непонятно почему не проходит - При запуске программы с параметрами "-c productName price quantity" в конец файла должна добавится новая строка с товаром.? все ж добавляется....
package com.javarush.task.task18.task1827;
/*
Прайсы
Программа запускается со следующим набором параметров:
-c productName price quantity
Значения параметров:
где id - 8 символов.
productName - название товара, 30 символов.
price - цена, 8 символов.
quantity - количество, 4 символа.
-c - добавляет товар с заданными параметрами в конец файла, генерирует id самостоятельно, инкрементируя максимальный id, найденный в файле.
В файле данные хранятся в следующей последовательности (без разделяющих пробелов):
id productName price quantity
Данные дополнены пробелами до их длины.
*/
import java.io.*;
public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String fileName = reader.readLine();
if (args.length > 3 && args[0].equals("-c")) { //если аргументы введены
String id = "1";
String productName = args[1];
String price = args[2];
String quantity = args[3];
//чтение файла
FileInputStream fis = new FileInputStream(fileName);
BufferedInputStream bis = new BufferedInputStream(fis);
byte [] byteArr = new byte[bis.available()];
while (bis.available() > 0) {
bis.read(byteArr);
}
bis.close();
//Id
if(byteArr.length > 0) { // если в файле есть данные
String s1 = "";
int idArr = byteArr.length - 50; //находим байты последней строки
for (int i = idArr; i < byteArr.length - 42; i++) { // находим байты ID(первые 8 символов) в последней строке
if ((char) byteArr[i] != 32) // если не ПРОБЕЛ
s1 = s1 + (char) byteArr[i]; // записываем ID в переменную s1
}
int i1 = Integer.parseInt(s1); //переводим в целое число
id = String.valueOf(++i1); // присваеваем переменной id инкремент считанного последнего ID файла
}
if (id.length() < 8) { //добавляем пробелы
int size = 8 - id.length();
for (int i = 0; i < size; i++)
id = id + " ";
} else if (id.length() > 8) //обрезаем
id = id.substring(0, 8);
//название
if(productName.length() < 30) {//добавляем пробелы
int size = 30 - productName.length();
for(int i = 0; i < size; i++)
productName = productName + " ";
}
else if (productName.length() > 30)//обрезаем
productName = productName.substring(0, 30);
//цена
if(price.length() < 8) {//добавляем пробелы
int size = 8 - price.length();
for(int i = 0; i < size; i++)
price = price + " ";
}
else if (price.length() > 8)//обрезаем
price = price.substring(0, 8);
//количество
if(quantity.length() < 4) {//добавляем пробелы
int size = 4 - quantity.length();
for(int i = 0; i < size; i++)
quantity = quantity + " ";
}
else if (quantity.length() > 4)//обрезаем
quantity = quantity.substring(0, 4);
//добавление в файл
FileOutputStream fos = new FileOutputStream(fileName, true);
BufferedOutputStream bos = new BufferedOutputStream(fos);
if(byteArr.length != 0) {
bos.write("\r\n".getBytes());
}
bos.write(id.getBytes());
bos.write(productName.getBytes());
bos.write(price.getBytes());
bos.write(quantity.getBytes());
bos.close();
}
}
}
/*
FileReader fr = new FileReader(fileName);
BufferedReader br = new BufferedReader(fr);
while (br.ready()) {
String s = br.readLine();
System.out.println(String.format("%-8.8s", s));
}
*/