Java удалить или изменить одну запись в файле - PullRequest
1 голос
/ 04 ноября 2011
// Create file 
    FileWriter fstream = new FileWriter(fileName, true); 
    BufferedWriter out = new BufferedWriter(fstream); 
    out.write(c.toString()); 
    //Close the output stream 
    out.close(); 

    // Code I used to read record I am using | as a seperator name and id 
    String fileName = folderPath + "listCatalogue.txt"; 
    String line = ""; 
    Scanner scanner; 
    String name, id; 
    scanner = new Scanner(fileName); 
    System.out.println(scanner.hasNextLine()); 
    while (scanner.hasNextLine()) { 
        line = scanner.nextLine(); 
        System.out.println(line); 
        StringTokenizer st = new StringTokenizer(line, "|"); 
        name = st.nextToken(); 
        id = st.nextToken(); 
        catalogues.add(new Catalogue(name, id)); 
    } 

Выше приведен код для создания файла и чтения файла. Как я могу удалить определенную запись в Файле, что я нашел в Google, это удалить файл, но не удалить определенную запись. Пример, который я предоставляю, если имя соответствует, удалите эту запись , Как изменить эту запись? Можно ли изменить запись с помощью файла?

1 Ответ

0 голосов
/ 04 ноября 2011

Удаление определенной записи в файле невозможно по нескольким причинам.

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

Итак, в чем решение.

  1. Вы можете читать запись файла по записи и записывать другиефайл запись за записью, если вы не видите запись, которую хотите удалить.Избегайте записи этой записи в другой файл.Это дает вам эффект удаления.Но этот метод не эффективен для больших файлов.
  2. Потоки файлов поддерживают методы mark() и skip().Если ваша структура данных позволяет получить позицию записи, которую вы хотите удалить, вы можете немедленно прибыть на эту позицию, позвонив по номеру skip().Проблема в том, чтобы удалить.для ее решения необходимо либо создать структуру данных, которая позволит пометить запись как удаленную.В этом случае вы на самом деле не удаляете запись, а просто отмечаете ее как удаленную.Другое решение - записать специальные (например, нулевые) значения поверх записи, но ваш читатель должен иметь возможность пропустить такие нулевые значения.Это решение имеет недостаток: если вы удалите много записей, файл будет не меньше.

Вариант: вы можете использовать API RandomAccessFile.Вы также можете использовать FileChannel.

...