#java #file #bufferedreader
#java #файл #bufferedreader
Вопрос:
В настоящее время я создаю простой текстовый редактор для университетской задачи и с помощью пользовательского ввода в уже существующем файле выполняю основные манипуляции (переключение мест строк или слов). места).
Моя программа состоит из класса FileManipulator, в котором содержится вся логика, и класса GUI (где main )
public class FileManipulator {
File file;//current file
BufferedReader fileReader; //Reader for the file
String currentDirectory; //Always verified due to setDirectory() validation
public FileManipulator() throws IOException{ ...;}
public void loadFile() throws IOException{
if(this.fileReader != null) {
this.fileReader.close();
}
this.file = new File(this.currentDirectory);
//if there isn't a txt file, ask user if he wants to create one
if(!file.exists()) { //logic for creating a new file}
//After we are sure a file exists in this directory, we init the fileReader
this.fileReader = new BufferedReader(new FileReader(this.file));
this.fileReader.mark(READ_AHEAD_LIMIT);
}
public void switchLines(int line1, int line2) throws ArrayIndexOutOfBoundsException, IOException {
//Logic about switching the lines here
//Writing to the file
writeToFile(fileContents);
}
//Will open a writer, write to the file and close the writer
private void writeToFile(ArrayList<String> listToPrint) throws IOException{
StringBuilder tempList = new StringBuilder();
for (String s : listToPrint) {
tempList.append(s);
tempList.append('n');
}
FileWriter fileWriter = new FileWriter(this.file);
fileWriter.append(tempList);
fileWriter.close();
/* In this function, we make changes to the file, however, when using getFileText()
* the changes written in the file aren't noticed and the old file is returned
*/
}
//Problematic function
public String getFileText() throws IOException{
fileReader.reset();
StringBuilder finalText = new StringBuilder();
String temp;
while((temp = fileReader.readLine()) != null) {
finalText.append(temp);
finalText.append('n');
}
return finalText.toString();
}
После внесения изменений в файл и его сохранения мой BufferedReader не обновляется. Он по-прежнему считывает содержимое до изменения.
Когда я использую метод LoadFile и перезагружаю тот же файл, буферизованное средство чтения закрывается и снова открывается, таким образом, содержимое файла обновляется, однако открытие и закрытие буферизованного средства чтения каждый раз, когда я его использую, не самое элегантное решение.
Я также думал о том, чтобы иметь ArrayList содержимого файла и обновлять его только после закрытия программы, но это было бы ненужным упражнением, если мне не хватает простого исправления.
Комментарии:
1. После прочтения файла убедитесь, что вы его закрыли. Возможно, вы не сможете выполнить запись в файл, пока он все еще открыт.
2. Примечательной частью
BufferedReader
является буферизованная часть. При сбросе и повторном чтении вы читаете буфер , а не файл. Вы должны закрыть и повторно открыть, чтобы снова прочитать файл.
Ответ №1:
BufferedReader просто работает таким образом. reset
и mark
полностью все сделано в памяти.
Существует много решений:
-
Эй, вы все равно уже решили сохранить все это в памяти. Почему бы не представить ваш текстовый файл не как a
BufferedReader
, а какString
илиList<String>
или что-то еще, и обновить код обновления, а затем записать его на диск, и нет никакого прочитанного кода, кроме как при запуске приложения? Зачем использовать диск как промежуточный? -
Используйте FileChannel, RandomAccessFile или какую-либо другую абстракцию для файлов, которые лучше поддерживают фактическое чтение с диска. Обратите внимание, что вам это тоже нужно при записи: во многих операционных системах «записать все это в этот файл с нуля» фактически создает новый файл, и любые дескрипторы открытых файлов по-прежнему указывают на старый файл, который больше не доступен из файловой системы.
-
Просто.. закройте это средство чтения файлов и откройте его снова или даже установите логический флаг, чтобы код чтения знал, что код записи внес изменения, и делайте это только тогда, когда флаг «true» (а затем, конечно, установите для него значение false).