Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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 - Fatal编程技术网

Java 检查文件名是否已更改

Java 检查文件名是否已更改,java,file,Java,File,我编写了一个Java程序,它监视目录的变化。我保存了一个文件列表(字符串[]),每x秒我就会得到一个新的列表,并对它们进行比较,找出哪些文件被添加,哪些文件被删除 问题是,如果我重命名一个文件,它将显示为删除一个旧名称的文件,然后添加一个新名称的文件 我可以做些什么来跟踪名称更改 编辑:我想为Java6找到一个解决方案。 代码: 另外,在这段代码中,如果我想写old=list(保留最后一个列表),我会在(字符串y:old)的行中得到一个NullPointerException。为什么?我不认为有

我编写了一个Java程序,它监视目录的变化。我保存了一个文件列表(字符串[]),每x秒我就会得到一个新的列表,并对它们进行比较,找出哪些文件被添加,哪些文件被删除

问题是,如果我重命名一个文件,它将显示为删除一个旧名称的文件,然后添加一个新名称的文件

我可以做些什么来跟踪名称更改

编辑:我想为Java6找到一个解决方案。 代码:


另外,在这段代码中,如果我想写old=list(保留最后一个列表),我会在(字符串y:old)的
行中得到一个
NullPointerException
。为什么?

我不认为有一种既便携、可靠又高效的方法可以做到这一点

  • 读取文件内容的成本很高,而且可能不可靠。(例如,如果您有两个具有相同内容的文件,它将中断

  • 依赖文件时间戳可能是不可靠的。(您可能有具有相同时间戳的不同文件。)

  • 我不认为
    WatchService
    可以检测到在目录中重命名的文件。(它可以检测到重命名入或重命名出,但在这种情况下不能……根据。)

  • 可靠而有效的方法(至少在Linux系统上)是使用本机Linux watch服务(支持更多FS事件),或者结合使用inode编号和本机文件创建时间戳。但这两者都涉及使用本机代码进行相关的系统调用


我认为没有一种既便携、可靠又高效的方法可以做到这一点

  • 读取文件内容的成本很高,而且可能不可靠。(例如,如果有两个文件具有相同的内容,则会导致中断。)

  • 依赖文件时间戳可能是不可靠的。(您可能有具有相同时间戳的不同文件。)

  • 我不认为
    WatchService
    可以检测到在目录中重命名的文件。(它可以检测到重命名入或重命名出,但在这种情况下不能……根据。)

  • 可靠而有效的方法(至少在Linux系统上)是使用本机Linux watch服务(支持更多FS事件),或者结合使用inode编号和本机文件创建时间戳。但这两者都涉及使用本机代码进行相关的系统调用


您是否有代码要共享,所以我们知道您目前是如何完成这项工作的?您是基于文件名的吗?您可以在文件系统中使用id而不是名称之类的东西…这样,即使文件被重命名,其id也不会更改…根据文件的数量,您可以对文件进行CRC o MD5并保持签入g根据这些散列,这样您就可以确定文件是否被删除。您是否有代码共享,这样我们就知道您目前是如何完成这项工作的?您是否基于文件的名称?您可以在文件系统中使用id之类的东西,而不是名称…这样,即使文件被重命名,其id也不会更改…取决于amm您可以将文件的CRC设置为MD5,并不断检查这些哈希值,以便确定文件是否已删除。
public void run() {
    int ok;
    while(true) {
        // verify if modified from last check
        if(modified != file.lastModified()) {
            Date d = new Date();
            list = file.list();
            // look for new files
            for(String x : list) {
                ok = 0;
                for(String y : old) {
                    if(x.equals(y)) {
                        ok = 1;
                    }
                }
                if(ok == 0) {  
                    display.setText(display.getText() + "Created file " + x  + " at " + d.toString() + "\n");
                }
            }
            // looking for old files
            for(String x : old) {
                ok = 0;
                for(String y : list) {
                    if(x.equals(y)) {
                        ok = 1;
                    }
                }
                if(ok == 0) {
                    display.setText(display.getText() + "Deleted file " + x + " at " + d.toString() + "\n");
                }
            }
        }
        old = file.list();
        modified = file.lastModified();
        try {
            Thread.sleep(f * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}