Java удалить или изменить одну запись в файле

#java #file #java.util.scanner

#java #файл #java.util.scanner

Вопрос:

 // 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, — это удалить файл, но не удалить определенную запись, например, я указываю имя, если совпадение удаляет эту запись. А также изменить эту запись? Возможно ли изменить запись с помощью File?

Ответ №1:

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

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

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

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

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