在不停止程序的情况下迭代更新后读取文本文件

Reading a text file after updating it iteratively without stopping the program

我正在我的程序中读取一个文本文件并对该文件进行了一些修改,然后在不停止程序的情况下,我反复读取该文件,一次又一次,每次我都应该能够读取最新的文件的版本。然而,在第一次修改文件后,其他时候我仍然得到该文件的版本并且似乎没有应用其他修改。 这是我阅读文件的方式:

  public static Map<String, Float> readOwnersBiasFile() throws IOException {
FileInputStream file = new FileInputStream("ownersBias.txt");
Map<String, Float> ownerBiasMap = new HashMap<String, Float>();
//Construct BufferedReader from InputStreamReader
BufferedReader br = new BufferedReader(new InputStreamReader(file));

    String line = null;
    while ((line = br.readLine()) != null) {
        String[] var = line.split("\^");
        ownerBiasMap.put(var[0], Float.valueOf(var[1]));
    }

    br.close();
    return ownerBiasMap;

} 这是我存储修改的方式:

  public static void storeOwnersUtilityMap(Map<String, Float> ownersUtilityMap) throws IOException {
    FileInputStream fileInputStream = null;
    InputStreamReader inputStreamReader = null;
    BufferedReader bufferedReader = null;
    List<String> lines = new ArrayList<String>();
    try {
        fileInputStream = new FileInputStream("ownersBias.txt");
        inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
        bufferedReader = new BufferedReader(inputStreamReader);

        String s;

        String[] var;
        if (bufferedReader.readLine() == null) {
            for (Map.Entry<String, Float> entry : ownersUtilityMap.entrySet()) {
                lines.add(entry.getKey().concat("^").concat(String.valueOf(entry.getValue())));
            }
        } else
            while ((s = bufferedReader.readLine()) != null) {

                var = s.split("\^");
                if (ownersUtilityMap.containsKey(var[0]))
                    s = var[0].concat("^").concat(String.valueOf(ownersUtilityMap.get(var[0])));
                lines.add(s);
            }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        IOUtils.closeQuietly(bufferedReader);
        IOUtils.closeQuietly(inputStreamReader);
        IOUtils.closeQuietly(fileInputStream);
    }

    fileWriter(lines, "ownersBias.txt");

}

    private static void fileWriter(List<String> list, String fileName) throws IOException {
    File fout = new File(fileName);
    FileOutputStream fos = new FileOutputStream(fout);

    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        bw.write(iterator.next());
        bw.newLine();
    }

    bw.close();
}

在我的主要方法中,我有一个循环来执行一些操作以及读取和修改文本文件。

    public static void main(String[] args) throws IOException, TasteException {
for(int i=0;i<10;i++){
map= readOwnersBiasFile();
do some stuff;
storeOwnersUtilityMap(map);
}
}

应该没有必要在重新读取之间关闭程序,我已经编写了可以读取同一文件并获取任何外部更改的程序。所以我知道的那个部分有效。

现在顶级方法 readOwnersBiasFile() 似乎并没有明确关闭所有内容;我看到 BufferedReader 已关闭,但没有看到 InputStreamReader 或 FileInputStream。离开方法时,对象没有引用,因此垃圾收集应该找到它们,时间可能是个问题。对于任何可关闭的内容,我都推荐使用 try-with-resources。

但是,操作系统可能会导致差异,尤其是当您同时从同一个 JVM 写入和读取时。例如,在 Windows 你不能 delete/move/rename 一个已经打开的文件,但是 *nix 你可以。我不知道的(部分是因为我不知道你是运行时平台)是 JVM 是否对文件句柄很棘手,并试图以这样一种方式重用,即更改不会从写入之前刷新被阅读或其他什么。

如果可能值得检查 File 对象的属性,请确保您看到大小更改或更改的上次修改日期或任何可能表明您实际上正在发现差异的内容。

我也无法说明您调用事物的顺序(特别是前两个代码块),无论您是在多线程还是其他方面做事。 Open/reading/writing 在多线程环境中可能会出现问题