我正在编写一个应用程序(用于教育目的),它需要使用数据库管理系统(我编写了自己极其原始的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 ,但如果我没弄错的话,它只会拒绝我的进程访问。
抱歉我的英语不好,希望你能理解我的问题。
答案 0 :(得分:2)
我不确定这是一个值得解决的问题。无论您采取何种方法,拥有正确权限的人都可以取消您的文件保护,并且无论如何都可以进行更改。
最好专注于优雅地处理无效数据,否则信任文件中的内容。添加某种完整性检查(每行或每个表)将使某些人更难以意外或恶意地更改您的数据,使其看起来“有效”。
答案 1 :(得分:2)
如果您阅读java.nio.channels.FileLock
文档中的“平台依赖关系”部分,请参阅:
FileLocks
不是(仅)用于锁定一个 JVM,而是用于锁定计算机上的所有进程。所以你basicyll必须问自己:我真正需要什么保护?
如果您只想防止在同一数据上多次运行您的程序,您可以假设您的程序“表现良好”并且
FileLocks
或如果你想要防范所有其他程序,那么就像你在Notepad ++场景中看到的那样迷失了:考虑所有平台以及绕过锁和使用Java的所有可能方法 - 你没有机会