2014-10-09 5 views
0

Итак, у меня есть программа, которая сохраняет для вас пароль и имена пользователей, а затем сохраняет их в TXT-файле. Я добавляю возможность удалить одну из записей на случай, если вы ошиблись или что-то еще. Вот как выглядит мой текстовый файл.Удаление строк из TXT-файла

Website 
Username 
Password 

anotherWebsite 
anotherUsername 
anotherPassword 

Теперь пароли не зашифрованы, поскольку мне было поручено не зашифровывать их.

Мой главный вопрос: можете ли вы удалить определенные строки в текстовом файле, не прочитав весь файл, а затем сохраните те, которые вы хотите добавить в новый файл, а затем с помощью этого?

+0

Возможный дубликат [Найти строку в файле и удалить ее] (http://stackoverflow.com/questions/1377279/find-a-line-in-a-file-and-remove-it) – karvoynistas

+0

@ karvoynistas, я посмотрел на него, но это не дубликат. Ответы даны, создавая новый текстовый файл, затем используя тот, который, если возможно, я не хочу делать. – Jonah

+0

Альтернативой перезаписи файла для каждой операции является загрузка файла в структуру данных и сохранение его в течение всего жизненного цикла программы. Затем экспортируйте данные в файл по завершении. Сохраняет процесс операций ввода-вывода файла каждый раз, когда вы делаете какие-либо изменения. – Grice

ответ

1

Что вам нужно сделать, это переписать весь файл и не писать строки, которые вы хотите пропустить.

Одна реализация от Find a line in a file and remove it кажется достаточно хорошим для вашего случая, вам просто нужно проверить на 3-х вещей (кортеж (сайт, Имя пользователя, пароль), а не только одного параметра.

public void removeLineFromFile(String file, String lineToRemove) { 

try { 

    File inFile = new File(file); 

    if (!inFile.isFile()) { 
    System.out.println("Parameter is not an existing file"); 
    return; 
    } 

    //Construct the new file that will later be renamed to the original filename. 
    File tempFile = new File(inFile.getAbsolutePath() + ".tmp"); 

    BufferedReader br = new BufferedReader(new FileReader(file)); 
    PrintWriter pw = new PrintWriter(new FileWriter(tempFile)); 

    String line = null; 

    //Read from the original file and write to the new 
    //unless content matches data to be removed. 
    while ((line = br.readLine()) != null) { 

    if (!line.trim().equals(lineToRemove)) { 

     pw.println(line); 
     pw.flush(); 
    } 
    } 
    pw.close(); 
    br.close(); 

    //Delete the original file 
    if (!inFile.delete()) { 
    System.out.println("Could not delete file"); 
    return; 
    } 

    //Rename the new file to the filename the original file had. 
    if (!tempFile.renameTo(inFile)) 
    System.out.println("Could not rename file"); 

} 
catch (FileNotFoundException ex) { 
    ex.printStackTrace(); 
} 
catch (IOException ex) { 
    ex.printStackTrace(); 
} 

}

+0

Я посмотрю, что я могу сделать. :) – Jonah

2

Ответ на ваш вопрос - нет. По сути, способ сделать это - переписать файл, опустив строку, которую вы хотите удалить.

+1

Ответ на самом деле «да, но это слишком сложно беспокоить». –

+0

Попугался. Думаю, я просто переписал файл. Благодаря! :) – Jonah

1

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

Если вы используют Java 8 я рекомендую использовать эту структуру:

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Paths; 

    public static void main(String[] args) throws IOException { 
     String content = new String(Files.readAllBytes(Paths.get("duke.java"))); 
    } 

Затем, со строкой, вы можете прочитать его, CONCAT или удалить информацию.

Ссылка: http://www.adam-bien.com/roller/abien/entry/java_8_reading_a_file

Если вы используете другую версию, перейдите по этой ссылке:

Find a line in a file and remove it

+0

Спасибо за предложение! :) – Jonah

1

В файле, каждый бит информации имеет место. Удаление некоторых из этих битов не перемещает положение других элементов.

File 

1111111111111111 
222222222.....22 
3333.33333.3.333 
44.444.444.444.4 
5555555555555555 

становится

1111111111111111 
222222222.....22 
44.444.444.444.4 
5555555555555555 

путем удаления

3333.33333.3.333 

и перемещение

44.444.444.444.4 
5555555555555555 

в месте предыдущего, проведенного

3333.33333.3.333 
44.444.444.444.4 

Таким образом, вы можете сделать это без временного файла, купить, используя следующую методику

  1. открывает произвольный доступ к файлам (мы будем прыгать в нем.
  2. Прочитайте файл до тех пор, пока вы не обнаружите элементы, которые нужно удалить, сохраняя «местоположение» начала этой области.
  3. Рассчитать «размер» удаленной области.
  4. Хотя есть область за удаленной областью, которая не была перемещена
    1. Скопируйте эту область по удаленной области.
    2. Переназначить удаленную область в область, из которой вы только что скопировали.
  5. Запишите конец файла.

Конечно, это действительно, действительно опасно; так как любое прерывание в процедуре оставляет вам файл, который не является оригиналом или результатом. Поскольку копии файлов могут быть легко прерваны перебоями в подаче электроэнергии, убитыми программами и т. Д., Вы действительно не хотите этого подхода, так как так сложно восстановить из-за сбоя.

Вот почему напишите второй файл, дождитесь, пока это будет сделано, а затем переместите его поверх исходного файла, это гораздо лучшее решение.

+0

Да, я мог видеть, как это будет рискованно. Наверное, я поеду с записью в новый файл. Спасибо за подробное объяснение! – Jonah

+0

Видно, как вы знаете свои вещи. Есть ли способ удалить все содержимое в текстовом файле без второго файла? При необходимости я могу создать новый вопрос. – Jonah

+1

@ Jonah Конечно, вы можете удалить содержимое в текстовом файле без записи второго файла. Просто откройте файл, а затем напишите маркер конца файла (обычно это делается библиотекой, сразу же закрывая его, это сделает, если у вас есть файл, открытый в правильном контексте). –

Смежные вопросы