Удалить строку из файла в Java - PullRequest
3 голосов
/ 18 марта 2010

Хорошо, поэтому я пытаюсь удалить строки из текстового файла с помощью Java. В настоящее время я делаю это, отслеживая номер строки и вводя индекс. Индекс - это строка, которую я хочу удалить. Поэтому каждый раз, когда я читаю новую строку данных, я увеличиваю количество строк. Теперь, когда я достигаю количества строк с таким же индексом, я не записываю данные во временный файл. Теперь это работает, но что, если, например, я работаю с огромными файлами и мне нужно беспокоиться об ограничениях памяти. Как я могу сделать это с помощью файловых маркеров? Например .. поместите маркер файла в строку, которую я хочу удалить. Затем удалить эту строку? Или это слишком много работы?

Ответы [ 4 ]

2 голосов
/ 18 марта 2010

Не храните файл в памяти, просто читайте его по одной строке за раз и записывайте во временный файл по одной строке за раз, пропуская строку, которую необходимо удалить.

1 голос
/ 18 марта 2010

Вы можете использовать nio , чтобы удалить область файла, соответствующую этой строке.

РЕДАКТИРОВАТЬ добавил несколько подсказок

Создав <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/channels/FileChannel.html" rel="nofollow noreferrer">FileChannel</a> и используя <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/Buffer.html" rel="nofollow noreferrer">Buffer</a>, вы можете открыть файл, стереть нужную строку, нажав на нее содержимое после.

К сожалению, я должен признаться, что мои знания о nio остановились примерно здесь ...

0 голосов
/ 18 марта 2010

В идеале, я бы использовал инструмент ETL для выполнения этого вида пакетной работы.Предполагая, что у вас нет доступа к такому инструменту, я бы рекомендовал сначала скопировать файл, а затем прочитать его, используя java.util.zip .

Вот хорошее руководство1006 * о том, как это сделать.

Надеюсь, это поможет!

0 голосов
/ 18 марта 2010

Вы можете использовать файл произвольного доступа. Держите указатель на байт, который вы читаете, и другой на байт, который вы пишете. Заполните буфер данными и, по мере чтения, считайте строки. Если вам нечего удалить, сбросьте канал на указатель записи и выведите буфер, затем сбросьте канал на указатель чтения. Если вы найдете строку, которую хотите удалить, выведите буфер в эту точку по индексу записи, затем увеличивайте указатель чтения до тех пор, пока не найдете конец строки, а затем выведите остаток буфера (при необходимости переполните буфер), повторите для каждой удаляемой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...