(java)如何在对文件进行更改后更新 BufferedReader
(java) How to update BufferedReader after making changes to the file
我目前正在为一项大学任务制作一个简单的文本编辑器,并且在用户输入的情况下,在一个已经存在的文件上,我正在做基本的操作(切换行位置或单词位置)。
我的程序包含一个 FileManipulator class,其中包含所有逻辑,以及一个 GUI class(其中有 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 方法并重新加载同一个文件时,缓冲的 reader 被关闭并重新打开,因此文件的内容被更新,但是每次打开和关闭缓冲的 reader我使用它的时间不是最优雅的解决方案。
我也考虑过使用文件内容的 ArrayList 并仅在关闭程序时更新它,但如果我缺少一个简单的修复方法,那将是不必要的练习。
BufferedReader 就是这样工作的。 reset
和 mark
完全 全部在内存中完成。
有多种解法:
嘿,无论如何,您已经致力于将整个内容存储在内存中。为什么不将您的文本文件表示为 BufferedReader
而不是 String
或 List<String>
或诸如此类的东西,并让更新代码更新它,然后将其写到磁盘上,并且没有阅读代码,除非应用程序启动?为什么使用磁盘作为中间件?
使用 FileChannel、RandomAccessFile 或其他对文件的抽象,特别是对实际从磁盘读取有更好的支持。请注意,您也需要此写入:在许多操作系统上,'write all this to this file from scratch' 实际上会创建一个新文件,并且任何打开的文件句柄仍指向旧文件,该文件不再可从文件系统访问。
只是..关闭那个文件阅读器并再次打开它,或者甚至设置一个布尔标志让读取代码知道写入代码进行了更改,并且只有在标志为 'true'(当然,然后将其设置为 false)。
我目前正在为一项大学任务制作一个简单的文本编辑器,并且在用户输入的情况下,在一个已经存在的文件上,我正在做基本的操作(切换行位置或单词位置)。
我的程序包含一个 FileManipulator class,其中包含所有逻辑,以及一个 GUI class(其中有 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 方法并重新加载同一个文件时,缓冲的 reader 被关闭并重新打开,因此文件的内容被更新,但是每次打开和关闭缓冲的 reader我使用它的时间不是最优雅的解决方案。
我也考虑过使用文件内容的 ArrayList 并仅在关闭程序时更新它,但如果我缺少一个简单的修复方法,那将是不必要的练习。
BufferedReader 就是这样工作的。 reset
和 mark
完全 全部在内存中完成。
有多种解法:
嘿,无论如何,您已经致力于将整个内容存储在内存中。为什么不将您的文本文件表示为
BufferedReader
而不是String
或List<String>
或诸如此类的东西,并让更新代码更新它,然后将其写到磁盘上,并且没有阅读代码,除非应用程序启动?为什么使用磁盘作为中间件?使用 FileChannel、RandomAccessFile 或其他对文件的抽象,特别是对实际从磁盘读取有更好的支持。请注意,您也需要此写入:在许多操作系统上,'write all this to this file from scratch' 实际上会创建一个新文件,并且任何打开的文件句柄仍指向旧文件,该文件不再可从文件系统访问。
只是..关闭那个文件阅读器并再次打开它,或者甚至设置一个布尔标志让读取代码知道写入代码进行了更改,并且只有在标志为 'true'(当然,然后将其设置为 false)。