Java 是否拒绝所有其他进程对文件的访问?
我正在编写一个应用程序(出于教育目的),它需要使用数据库管理系统(我编写了自己的非常原始的DBMS,这是任务的一部分)。我想确保在我的应用程序运行的任何时候,所有表的内容都是正确的。为此,我编写了方法,它检查每个文件并进行必要的检查。问题是,我只想在应用程序启动并拒绝访问文件时调用此方法一次,以确保在我的程序运行时没有人更改文件内容 我使用以下方法。当应用程序启动时,我初始化InputStreamReader和OutputStreamWriter,存储它们并仅在应用程序终止时关闭它们 初始化方法的一部分:Java 是否拒绝所有其他进程对文件的访问?,java,file,java-io,Java,File,Java Io,我正在编写一个应用程序(出于教育目的),它需要使用数据库管理系统(我编写了自己的非常原始的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");
}
试试看{
for(映射表\映射:tables.values()){
OutputStreamWriter osw=(OutputStreamWriter)表_map.get(“osw”);
InputStreamReader isr=(InputStreamReader)表_map.get(“isr”);
如果(osw!=null)
osw.close();
如果(isr!=null)
isr.close();
}
}
捕获(IOE异常){
抛出新的DBException(“关闭错误”);
}
在一定程度上,这种方法是有效的,因为当我尝试使用MS记事本修改这些文件时,我会遇到以下错误
“进程无法访问该文件,因为它正由用户使用
“另一个过程”
这就是我想看到的。但是如果我使用Notepad++,我可以在应用程序运行时进行任何修改,这不是我期望看到的。那么,我该怎么做才能确保没有其他进程可以修改我的文件呢
我试图使用FileLock,但如果我没弄错的话,它只拒绝对我的进程进行访问
对不起,我的英语很差,希望你能理解我的问题。我不确定这是一个值得解决的问题。无论您采取何种方法,具有正确权限的人可能会撤消您的文件保护,并且可以进行更改
最好专注于优雅地处理无效数据,否则就要相信文件中的内容。添加某种完整性检查(每行或每表)将使某人更难意外或恶意更改您的数据,使其看起来“有效”。我不确定这是否是一个值得解决的问题。无论您采取何种方法,具有正确权限的人可能会撤消您的文件保护,并且可以进行更改 最好专注于优雅地处理无效数据,否则就要相信文件中的内容。添加某种完整性检查(每行或每表)将使某人更难意外或恶意更改您的数据,使其看起来“有效”。如果您阅读
java.nio.channels.FileLock
docs中的“平台依赖项”一节,您会看到:
不仅用于在一个JVM内锁定,而且用于计算机上的所有进程FileLocks
- 文件锁(注意不同的拼写)在很大程度上取决于平台和配置
- 使用
或文件锁
- 使用标记锁文件或
- 在文件内使用“脏/锁”标记
Java.nio.channels.FileLock
文档中的“平台依赖性”部分,你会看到:
不仅用于在一个JVM内锁定,而且用于计算机上的所有进程FileLocks
- 文件锁(注意不同的拼写)在很大程度上取决于平台和配置
- 使用
或文件锁
- 使用标记锁文件或
- 在文件内使用“脏/锁”标记
如果你想保护自己不受任何其他程序的攻击,那么就像你在记事本++场景中看到的那样,你就迷失了方向:考虑到所有平台和所有可能的绕过锁的方法,使用Java——你没有机会。我将使用一个对象来保存
osw
和isr
。我会对它们进行缓冲以提高性能,并且不会存储原始流,因为您不需要这些流。我会使用合适的IDE来帮助您编写、运行和调试代码。拒绝访问文件的最简单方法是重命名它。这样你赢了;如果您不知道该文件的名称,则无法访问它,您可以更改其扩展名。是的,重命名该文件通常会带来好处。。。只需确保将其重命名为“高度唯一”,如filename.UUID.ext。请看文档:对不起,我的英语很差>,你的问题读起来很好。可能比所谓的母语人士所写的许多努力要好:-)@PeterLawrey可能需要非常小心地正确处理所有错误条件,以确保在程序退出时将文件重命名为其原始名称。我将使用包含osw
和isr
的对象,而不是使用映射。我会对它们进行缓冲以提高性能,并且不会存储原始流,因为您不需要这些流。我会使用一个合适的IDE来帮助您编写、运行和调试代码