Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否拒绝所有其他进程对文件的访问?_Java_File_Java Io - Fatal编程技术网

Java 是否拒绝所有其他进程对文件的访问?

Java 是否拒绝所有其他进程对文件的访问?,java,file,java-io,Java,File,Java Io,我正在编写一个应用程序(出于教育目的),它需要使用数据库管理系统(我编写了自己的非常原始的DBMS,这是任务的一部分)。我想确保在我的应用程序运行的任何时候,所有表的内容都是正确的。为此,我编写了方法,它检查每个文件并进行必要的检查。问题是,我只想在应用程序启动并拒绝访问文件时调用此方法一次,以确保在我的程序运行时没有人更改文件内容 我使用以下方法。当应用程序启动时,我初始化InputStreamReader和OutputStreamWriter,存储它们并仅在应用程序终止时关闭它们 初始化方法

我正在编写一个应用程序(出于教育目的),它需要使用数据库管理系统(我编写了自己的非常原始的DBMS,这是任务的一部分)。我想确保在我的应用程序运行的任何时候,所有表的内容都是正确的。为此,我编写了方法,它检查每个文件并进行必要的检查。问题是,我只想在应用程序启动并拒绝访问文件时调用此方法一次,以确保在我的程序运行时没有人更改文件内容

我使用以下方法。当应用程序启动时,我初始化InputStreamReaderOutputStreamWriter,存储它们并仅在应用程序终止时关闭它们

初始化方法的一部分:

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中的“平台依赖项”一节,您会看到:

  • FileLocks
    不仅用于在一个JVM内锁定,而且用于计算机上的所有进程
  • 文件锁(注意不同的拼写)在很大程度上取决于平台和配置
所以你必须问自己:我真正需要什么样的保护

如果您只想防止在同一数据上多次运行程序,那么可以假定您的程序“运行良好”,并且

  • 使用
    文件锁
  • 使用标记锁文件或
  • 在文件内使用“脏/锁”标记
如果你想保护自己不受任何其他程序的攻击,那么你就会迷失方向,正如你在记事本++场景中看到的那样:考虑所有平台和所有可能的绕过锁定的方法,并使用Java—你没有机会。

如果你阅读
Java.nio.channels.FileLock
文档中的“平台依赖性”部分,你会看到:

  • FileLocks
    不仅用于在一个JVM内锁定,而且用于计算机上的所有进程
  • 文件锁(注意不同的拼写)在很大程度上取决于平台和配置
所以你必须问自己:我真正需要什么样的保护

如果您只想防止在同一数据上多次运行程序,那么可以假定您的程序“运行良好”,并且

  • 使用
    文件锁
  • 使用标记锁文件或
  • 在文件内使用“脏/锁”标记

如果你想保护自己不受任何其他程序的攻击,那么就像你在记事本++场景中看到的那样,你就迷失了方向:考虑到所有平台和所有可能的绕过锁的方法,使用Java——你没有机会。

我将使用一个对象来保存
osw
isr
。我会对它们进行缓冲以提高性能,并且不会存储原始流,因为您不需要这些流。我会使用合适的IDE来帮助您编写、运行和调试代码。拒绝访问文件的最简单方法是重命名它。这样你赢了;如果您不知道该文件的名称,则无法访问它,您可以更改其扩展名。是的,重命名该文件通常会带来好处。。。只需确保将其重命名为“高度唯一”,如filename.UUID.ext。请看文档:对不起,我的英语很差>,你的问题读起来很好。可能比所谓的母语人士所写的许多努力要好:-)@PeterLawrey可能需要非常小心地正确处理所有错误条件,以确保在程序退出时将文件重命名为其原始名称。我将使用包含
osw
isr
的对象,而不是使用映射。我会对它们进行缓冲以提高性能,并且不会存储原始流,因为您不需要这些流。我会使用一个合适的IDE来帮助您编写、运行和调试代码