【发布时间】:2012-10-24 09:55:21
【问题描述】:
我正在编写一个应用程序(用于教育目的),它需要使用数据库管理系统(我自己编写了极其原始的 DBMS,它是任务的一部分)。而且我想确保在任何时候我的应用程序正在运行的所有表的内容都是正确的。为此,我编写了方法,它查看每个文件并进行必要的检查。问题是我只想在应用程序启动并拒绝访问文件时调用此方法一次,以确保在我的程序运行时没有人更改其内容。
我使用以下方法。应用程序启动时,我会初始化 InputStreamReader 和 OutputStreamWriter,存储它们并仅在应用程序终止时关闭它们。
部分初始化方法:
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(file, true);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
this.tables.get(table).put("fis", fis);
this.tables.get(table).put("fos", fos);
this.tables.get(table).put("isr", isr);
this.tables.get(table).put("osw", osw);
关闭方法:
try {
for(Map<String, Object> table_map: tables.values()) {
OutputStreamWriter osw = (OutputStreamWriter)table_map.get("osw");
InputStreamReader isr = (InputStreamReader)table_map.get("isr");
if (osw != null)
osw.close();
if (isr != null)
isr.close();
}
}
catch (IOException e) {
throw new DBException("Closing error");
}
部分地,这种方法有效,因为当我尝试使用 MS 记事本修改这些文件中的任何一个时,我收到以下错误
"进程无法访问该文件,因为它正被 另一个进程”
这就是我想看到的。但是如果我使用 Notepad++,我可以在我的应用程序运行时进行任何修改,这不是我期望看到的。那么我该怎么做才能确保没有其他进程可以修改我的文件呢?
我尝试使用 FileLock,但如果我没记错的话,它只会拒绝我的进程访问。
对不起,我的英语不好,希望你能理解我的问题。
【问题讨论】:
-
我不会使用地图,而是使用包含
osw和isr的对象。我会缓冲它们以提高性能,并且我不会存储原始流,因为您不需要它们。我会使用合适的 IDE 来帮助您编写、运行和调试代码。 -
拒绝访问文件的最简单方法是重命名文件。这样,除非您知道文件的名称,否则您将无法访问它,您可以更改其扩展名。
-
是的,重命名文件通常是一种享受...只需确保将其重命名为“高度独特”的名称,例如 filename.UUID.ext。查看文档:docs.oracle.com/javase/6/docs/api/java/util/UUID.html
-
对不起,我的英语很差 > 对于它的价值,你的问题读起来很好。可能比所谓的母语人士写的许多努力要好:-)
-
@PeterLawrey 可能需要非常小心地正确处理所有错误情况,以确保文件在程序退出时重命名为其原始名称。