Перестаёт правильно работать Integer.parseInt() при обработке строк из файла, в чем может быть причина?
Только начинаю постигать азы Java, поэтому не судите строго :) Имеется файл с расширением .txt. При запуске файла с аргументами в файл должен добавиться новый лот с новым id, который должен быть больше максимального из всех существующих в файле на 1. Содержимое файла, например:
19846___Шорты пляжные синие__________159.00__12
198478__Шорты пляжные черные с рисунко173.00__17
19847983Куртка для сноубордистов, разм10173.991234
id = 8 в символов, productName = 30 символов, price = 8 символов, quantity = 4 символа. Разделяющих пробелов между лотами нет. Каждый лот с новой строки. Имеется следующий код:
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class SolutionTask1827ArgsParamFile {
public static void main(String[] args) throws Exception {
// проверка
args = new String[] {"-c", "Брюки кожаные", "1600.00", "25"};
// программа должна работать если параметры введены, в остальных
// случаях ничего не делаем
if (args.length != 0) {
// создаем поток для чтения имени файла
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// в переменную fileName записываем имя файла прочитанного с консоли
String fileName = reader.readLine();
// закрываем поток чтения имени файла
reader.close();
// создаем поток для чтения строк из файла и присваиваем ссылке reader этот
// поток
BufferedReader readerFile = new BufferedReader(new FileReader(fileName));
// переменная, в которую поочередно читаем строки из файла
String line;
// Коллекция, в которую добавляем прочитанные строки
List<String> priceList = new ArrayList<>();
// переменная, в которую будем писать максимальный id
int idMax = 0;
// переменная, в которую будем заносить извлеченный из строки id и переведенный
// в тип Integer
int id;
// читаем строки из файла и добавляем в коллекцию пока есть хоть одна строка
while ((line = readerFile.readLine()) != null) {
priceList.add(line);
/* нужно найти максимальный id среди всех лотов в прайсе
т.к. известно, что id находится в начале строки и занимает всегда 8 символов
в строке, включая пробелы, поэтому берем из коллекции каждый элемент
представляющий собой строку лота и из этой строки выделяем подстроку
из первых восьми элементов, убираем лишние пробелы применив метод trim()
и переведя в Integer находи максимальный id
*/
String lineCut = line.substring(0,8).trim();
id = Integer.parseInt(lineCut);
if (id > idMax) idMax = id;
}
// закрываем поток для чтения данных из файла
reader.close();
// закрываем поток для чтения из файла
readerFile.close();
// по условию id следующего лота должен быть на 1 больше максимально поэтому
// инкрементируем максимальный id
idMax++;
/* следующим этапом нам необходимо добавить в уже имеющуюся коллекцию новую
строку, представляющую собой лот из полученного нами idMax, предварительно
переведенного в String, и в случае, если количество символов в нем меньше
8, то добавлено недостающее кол-во пробелов, а также аргументов, которые
были переданы при запуске программы args[1] - название из 30 символов,
args[2] - цена из 8 символов, args[3] - количество из 4 символов. Если символов
не хватает, то они так же должны быть добиты пробелами по аналогии с id
*/
// переведем id из Integer в String и добавим недостающие пробелы до 8
// символов
String idString = String.valueOf(idMax);
// переменная в которую запишем длину строки с id
int length = idString.length();
if (length < 8 ) {
for (int i = 0; i < 8 - length ; i++) {
idString += " ";
}
}
// добавим в наименование товара недостающие до 30 символов пробелы
// если требуется
String productName = args[1];
if (productName.length() < 30) {
for (int i = 0; i < 30 - args[1].length(); i++) {
productName += " ";
}
}
// добавим в сумму недостающие до 8 символов пробелы, если требуется
String price = args[2];
if (price.length() < 8) {
for (int j = 0; j < 8 - args[2].length(); j++) {
price += " ";
}
}
// добавим в количество недостающие до 4 символов пробелы, если требуется
String quantity = args[3];
if (quantity.length() < 4) {
for (int n = 0; n < 4 - args[3].length(); n++) {
quantity += " ";
}
}
// соединяем все полученные данные позиции в одну строку и добавляем в
// коллекцию
priceList.add(idString + productName + price + quantity);
if (args[0].equals("-c")) {
// создаем поток для записи в файл
BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
//записываем все элементы из коллекции в файл
for (String e: priceList) {
// для записи с новой строки добавляем "\r\n"
if (e.equals(priceList.get(priceList.size()-1)))writer.write(e);
else writer.write(e + "\r\n");
}
// закрываем поток для записи
writer.close();
}
}
}
}
Код работает, но! Если удалить содержимое файла и занести в него исходные данные, или просто сохранить файл, нажав "сохранить", то при попытке запустить файл компилятор выдает ошибку Exception in thread "main" java.lang.NumberFormatException: For input string: "19846"
указывая на строку с кодом id = Integer.parseInt(lineCut);
Проблема решается только после удаления файла и нового создания файла с исходными данными.
Еще заметил, что после того как код перестает корректно работать, чтение подстроки с 0-ого по 8-ой символ происходит не корректно, т.к. читается не 8 символов, а 7. Т.е. если первый id записать полным, в 8 символов, например, 12345678, то с помощью конструкции substring(0, 8) результат становится не 12345678, как ожидается и как должно быть, а 1234567.
Что может произойти с файлом при сохранении оператором такого, что он перестает корректно парситься?
Подскажите пожалуйста в чем может быть проблема, очень хочется понять, дабы избежать подобных проблем при работе с текстами файлов в дальнейшем.
Заранее спасибо!