(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 就是这样工作的。 resetmark 完全 全部在内存中完成。

有多种解法:

  1. 嘿,无论如何,您已经致力于将整个内容存储在内存中。为什么不将您的文本文件表示为 BufferedReader 而不是 StringList<String> 或诸如此类的东西,并让更新代码更新它,然后将其写到磁盘上,并且没有阅读代码,除非应用程序启动?为什么使用磁盘作为中间件?

  2. 使用 FileChannel、RandomAccessFile 或其他对文件的抽象,特别是对实际从磁盘读取有更好的支持。请注意,您也需要此写入:在许多操作系统上,'write all this to this file from scratch' 实际上会创建一个新文件,并且任何打开的文件句柄仍指向旧文件,该文件不再可从文件系统访问。

  3. 只是..关闭那个文件阅读器并再次打开它,或者甚至设置一个布尔标志让读取代码知道写入代码进行了更改,并且只有在标志为 'true'(当然,然后将其设置为 false)。