在不停止程序

时间:2016-04-28 23:26:30

标签: java fileinputstream fileoutputstream

我正在我的程序中读取一个文本文件并对文件进行一些修改然后不停止程序,我一遍又一遍地读取文件,每次我应该能够读取最新版本的文件文件。但是,在文件中第一次修改后,其他时候我仍然得到该文件的版本,似乎没有应用其他修改。 以下是我阅读文件的方法:

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

1 个答案:

答案 0 :(得分:0)

在重新读取之间不需要关闭程序,我编写了可以读取同一文件并获得任何外部更改的程序。所以这部分我知道有用。

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

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

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

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