Перестаёт правильно работать 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. Что может произойти с файлом при сохранении оператором такого, что он перестает корректно парситься? Подскажите пожалуйста в чем может быть проблема, очень хочется понять, дабы избежать подобных проблем при работе с текстами файлов в дальнейшем.

Заранее спасибо!


Ответы (0 шт):