#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:
Удаление определенной записи в файле невозможно по нескольким причинам.
Во-первых, запись — это термин вашего прикладного уровня. Файловая система знает только последовательность байтов. Вторые потоки, которые вы используете для доступа к файлу, являются абстракциями, которые также не поддерживают удаление.
Итак, каково решение.
- Вы можете читать файл запись за записью и записывать другой файл запись за записью, если не увидите запись, которую хотите удалить. Избегайте записи этой записи в другой файл. Это дает вам эффект удаления. Но этот метод неэффективен для больших файлов.
- Поддержка файловых потоков
mark()
иskip()
методов. Если ваша структура данных позволяет получить позицию записи, которую вы хотите удалить, вы можете немедленно перейти к этой позиции, позвонивskip()
. Проблема заключается в удалении. чтобы решить эту проблему, вы должны либо создать структуру данных, которая позволяет помечать запись как удаленную. В этом случае вы на самом деле не удаляете запись, а просто помечаете ее как удаленную. Другим решением является запись специальных (например, нулевых) значений поверх записи, но ваш читатель должен иметь возможность пропускать такие нулевые значения. Это решение имеет недостаток: если вы удалите много записей, файл не будет меньше.
Вариант: вы можете использовать RandomAccessFile API. Вы также можете использовать FileChannel.