RandomAccessFile для изменения строки в определенной строке - PullRequest
0 голосов
/ 22 мая 2019

Введение

Я бросил себе вызов с этим проектом.

Мне нужно изменить данные в определенной строке в .txt без выполнения следующих действий:

  • Загрузка всего в память (Карты, Списки, Массивы ...)
  • Необходимость копирования файла (например, -> это ) и, следовательно, занимает место на компьютере (представьте себе огромный файл, массивный!)
  • Нет реляционных БД и тому подобного

Простой файл .txt будетесть все!

Текстовый файл

1;asd1324;2019-05-22 18:28:56;0;0;
2;asd1324;2019-05-22 18:28:56;0;0;
3;asd1324;2019-05-22 18:28:56;0;0;
4;asd1324;2019-05-22 18:28:56;0;0;
5;asd1324;2019-05-22 18:28:56;0;0;
6;asd1324;2019-05-22 18:28:56;0;0;

следует этому формату, который представляет собой строки с ";"в качестве разделителя.

Мой код попробовать, который работает для чисел от 0 до 9

(от 0 до 9 означает это первое число -> 1 ; asd1324; 2019-05-22 18: 28: 56; 0; 0;)

public static void test(int lineNumber, String data)
    {
        String line;


          try{

              System.out.println("----DEBUG TEST----\n");

              RandomAccessFile file = new RandomAccessFile("parking.txt", "rw");

              System.out.println("File pointer is: " + file.getFilePointer());

              System.out.println("Line size is: " + file.readLine().length());

              System.out.println("Read line is: " + (line = file.readLine()) + " with size: " + line.length());     

              file.seek(line.length());

              System.out.println("File pointer is: " + file.getFilePointer());

              file.writeChars("\n");
              file.writeBytes("7;asd1324;2019-05-22 18:28:56;0;0;");
              file.writeChars("\n");


              System.out.println("File pointer is: " + file.getFilePointer());

              System.out.println("Line size is: " + file.readLine().length());

              System.out.println("Read line is: " + (line = file.readLine()) + " with size: " + line.length());    


              file.seek(lineNumber);

              file.close();

          }catch(IOException e){System.out.println(e);}

          System.out.println("\n----DEBUG TEST----\n");        



    }

Понимание проблемы

Строка-> 1; asd1324; 2019-05-22 18: 28: 56; 0; 0;

  • Эти последние два '0' будут другим форматом даты как "yy/ MM / дд ЧЧ: мм: сс "и случайное число (целое число), которое добавляет больше длины, и это будет портить .txt

Пример: 1; asd1324; 2019-05-22 18: 28: 56; 2019-06-01 10: 11: 16; 100;

  • Первая строка - это число от 0 до последнего номера записи (это код)

Я хочу добавить их, заменив строку на ее позиции.

Примечания

Мы всегда будем знать размерстроки, которую мы собираемся изменить (методы) и действовать соответственно.

Что я ожидаю от этого

Возможность изменить строку изфайл в Java.Что также может быть общим методом для этого действия.

1 Ответ

2 голосов
/ 23 мая 2019

Нет такого понятия, как текстовый файл на носителе данных (например, HDD, RAM, Flash и т. Д.).Компьютеры всегда хранят все в двоичном формате (т.е. байты). Текстовый файл - это человеческое понятие.

Взяв ваш пример выше:

1;asd1324;2019-05-22 18:28:56;0;0;
2;asd1324;2019-05-22 18:28:56;0;0;
3;asd1324;2019-05-22 18:28:56;0;0;
4;asd1324;2019-05-22 18:28:56;0;0;
5;asd1324;2019-05-22 18:28:56;0;0;
6;asd1324;2019-05-22 18:28:56;0;0;

Вот как первые две строки выглядят для компьютера (в HEX):

313B6173 64313332 343B3230 31392D30 352D3232 2031383A 32383A35 363B303B 303B0A
323B6173 64313332 343B3230 31392D30 352D3232 2031383A 32383A35 363B303B 303B0A

Обратите внимание, как заканчивается строка (0A), что является символом конца строки для большинства систем * nix.В Windows это будет 0D0A (или 0A0D?), А в Mac это будет 0D.

Теперь, чтобы изменить строку, она не должна быть длиннее оригинальной, иначе вы перезапишетена начало следующей строки.Предположим, что вы изменили первую строку с

1;asd1324;2019-05-22 18:28:56;0;0;

на

1;asd1324;2019-05-22 18:28:56;0;01;

, в результате вы получите (первые 2 строки):

313B6173 64313332 343B3230 31392D30 352D3232 2031383A 32383A35 363B303B 30313B
323B6173 64313332 343B3230 31392D30 352D3232 2031383A 32383A35 363B303B 303B0A

, так что ваш файл будеттеперь будет читать как:

1;asd1324;2019-05-22 18:28:56;0;01;2;asd1324;2019-05-22 18:28:56;0;0;
3;asd1324;2019-05-22 18:28:56;0;0;
4;asd1324;2019-05-22 18:28:56;0;0;
5;asd1324;2019-05-22 18:28:56;0;0;
6;asd1324;2019-05-22 18:28:56;0;0;

Теперь у вас есть 5 строк вместо 6, поскольку вы перезаписали символ завершения строки исходной первой строки.

Со всемиТем не менее, изменение текстового файла без перезаписи может быть очень утомительной и сложной задачей.Это намного быстрее и проще переписать целое с вашими модификациями.В противном случае военный учебный лагерь будет походить на прогулку в парке по сравнению.

...