Управление текстовым файлом с использованием класса RandomAccessFile

У меня есть текстовый файл базы данных, в котором я хочу манипулировать определенными строками. Например: я хочу удалить набор данных в строке 44 или отредактировать набор данных в строке 22. Я пробовал FileWriter и RandomAccessFile, которые, похоже, не подходят для этой работы. FileWriter может только добавлять текст в файл и не использует указатель для навигации по базе данных. RandomAccessFile кажется хорошим для работы, но я продолжаю сталкиваться с проблемой, что, когда я использовал методы RAF в моем txt-файле, кодировка файла ломается, и как только я его открываю, я вижу только странные символы Unicode. Можно ли использовать класс RAF, не нарушая кодировку, или есть другой класс для управления файлами в определенных местах байтов или в определенных строках. Заранее спасибо!

Код для РАФ:

public static void main(String[] args)
{
    try
    {
        RandomAccessFile raf = new RandomAccessFile("test123.txt", "rw");
        raf.seek(0);
        raf.writeChars("First line of text" + System.lineSeparator());
        raf.writeChars("Second line of text");
        raf.close();
    }
    catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Вывод в файле: Первая строка текста

S e c o n d l i n e o f t e x t


person skonline90    schedule 15.02.2018    source источник
comment
Взгляните на этот пост stackoverflow.com/questions/9964892/ вам нужно указать кодировку при чтении строк, чтобы они не были повреждены   -  person Bentaye    schedule 15.02.2018
comment
Возможный дубликат Как читать файл в кодировке UTF8 с помощью RandomAccessFile?   -  person Bentaye    schedule 15.02.2018
comment
Откуда ты вообще знаешь кодировку? Я создал файл, используя класс File, просто используя String test.txt   -  person skonline90    schedule 15.02.2018
comment
Затем введите свой код в свой вопрос, и мы можем посмотреть   -  person Bentaye    schedule 15.02.2018
comment
Вы должны решить, хотите ли вы текстовый файл (тогда используйте только Reader и Writer) или двоичный файл с блоками байтов, которые могут быть интерпретированы как строки, записи или что-то еще. Не пытайтесь манипулировать текстовым файлом с помощью RandomAccessFile. Чтобы манипулировать текстовым файлом, вы должны прочитать его как текст и записать измененную версию как текст. Вам не нужно держать весь файл в памяти, но он всегда читается как текст, обрабатывается, записывается как текст. Не пытайтесь удалить строку в текстовом файле с помощью RandomAccessFile (за исключением того, что вы точно знаете, что делаете).   -  person vanje    schedule 15.02.2018
comment
Я вполне открыт для использования читателя и писателя. Но, как я сказал в начале, это не дает мне свободы ф.е. перейти к строке 500 и отредактировать там текст. Или я ошибаюсь в этом? Если нет, то я вижу RAF как единственный вариант для моей программы.   -  person skonline90    schedule 15.02.2018
comment
Хм, я думаю, ваше единственное заблуждение состоит в том, что вы думаете, что RAF хорош для манипулирования текстовыми файлами. Конечно, вы можете заменить некоторые символы, но только если новые символы закодированы с тем же количеством байтов, что и исходные символы. Как бы вы удалили символ в строке 500? Сначала вы находите начальную позицию и количество байтов для этого символа. Затем вам нужно переместить все байты позади вперед, чтобы закрыть пробел. Или, чтобы вставить один символ, вам нужно сдвинуть все байты в позиции вставки, чтобы освободить место для ваших новых байтов. Это неэффективно и подвержено ошибкам.   -  person vanje    schedule 16.02.2018
comment
Таким образом, вместо того, чтобы пытаться изменить текстовый файл на месте, рекомендуемый способ изменить строку 500 текстового файла: прочитать первые 499 и записать их как есть в новый временный файл. Затем прочитайте строку 500 и измените ее. Запишите строку 500 во временный файл. Затем прочитайте все оставшиеся строки и запишите их без изменений во временный файл. Затем закройте временный файл. Удалите исходный файл и переместите временный файл в исходное положение. Если это все еще слишком медленно для вас (вам следует провести некоторые реальные тесты производительности), вам следует рассмотреть другой формат файла для выполнения быстрых изменений и экспортировать текст только в конце.   -  person vanje    schedule 16.02.2018