2016-04-28 30 views
0

我正在读取程序中的文本文件,并在文件中进行一些修改,然后不停止程序,我反复读取文件并一次又一次地读取每个文件我应该能够阅读最新版本的文件。但是,在文件第一次修改后,其他时间我仍然得到该文件的版本,似乎其他修改不适用。 这里是我读文件:在不停止程序的情况下迭代更新文本文件

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); 
} 
} 
+0

您能给出一个实际编译的代码吗?看来你已经合并了两种方法 – Dici

+0

我更新了描述。 – HimanAB

+0

而不是重复读取文件,然后尝试写回文件,您应该使用RandomAccessFile追加到文件。 – pczeus

回答

0

不应该有必要关闭,将读取相同的文件,并得到任何外界变化重新读取,我写程序的程序。所以我知道那部分工作。

现在,顶层方法readOwnersBiasFile()似乎并没有明确地关闭所有东西;我看到BufferedReader关闭了,但没有看到InputStreamReader或FileInputStream。当离开方法时,对象没有引用,因此垃圾收集应该找到它们,时间可能是一个问题。我建议尝试与资源关闭任何东西。

但是,操作系统可能会导致差异,尤其是在您从同一个JVM进行写入和读取的情况下。例如,在Windows中,您不能删除/移动/重命名已打开的文件,但可以使用* nix。我不知道的(部分是因为我不知道你是运行时平台)是JVM是否对文件句柄很棘手,并试图以这样的方式重用,即在事情之前不会从写入刷新变化被阅读或不管。

如果您可能有必要检查File对象的属性,请确保您看到大小更改或更改了上次修改日期或任何可能表明您实际选取差异的内容。

我也无法告诉任何关于你调用东西的顺序(特别是前两个代码块),无论你是在做多线程还是在做什么。在多线程环境中打开/读取/写入可能有问题

相关问题