有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

io使用Java在目录中查找第一个文件

我有一些批处理程序,应该从目录中提取一个文件并处理它

由于该计划应:

  • 在JDK5上运行
  • 要小(没有外部库)
  • 而且快!(砰的一声)

不使用File.list()(可能是数百个文件),从目录中只选择一个文件的最佳方法是什么


共 (6) 个答案

  1. # 1 楼答案

    Java 1.5上没有好的解决方案,可以使用过滤器只获取一个文件,但Java只返回一个文件,但无论如何都要对所有文件进行解析。如果不需要实际的文件对象,可以尝试Runtime.getRuntime().exec("dir")\n上拆分返回的字符串,并打印出第一行:-P

  2. # 2 楼答案

    编辑:我的实现利用了。list()正如您所说,它不会,但无论如何它可能有一些价值:)

    如果查看文件实现,公共字符串[]list()方法的开销似乎比文件[]listFiles()小。所以最快的应该是

    String[] ss = myDir.list();
    File toProcess = null;
    for(int i = o ; i< ss.length ; i++){
     toProcess = new File(myDir.list()[i], myDir));
     if(toProcess.isFile())break;
    }
    

    从文件中。阶级

    public File[] listFiles() {
    String[] ss = list();
    if (ss == null) return null;
    int n = ss.length;
    File[] fs = new File[n];
    for (int i = 0; i < n; i++) {
        fs[i] = new File(ss[i], this);
    }
    return fs;
    }
    
  3. # 3 楼答案

    在Java 7中可以使用DirectoryStream,但在Java 5中,获取目录项的唯一方法是list()listFiles()

    请注意,列出一个包含数百个文件的目录并不理想,但与处理其中一个文件相比,可能还是没什么大不了的。但一旦目录中包含数千个文件,它可能就会开始出现问题

  4. # 4 楼答案

    从您所说的内容来看,您似乎希望对目录中的每个文件(包括添加到目录中的文件)进行一次处理。可以执行以下操作:在添加文件时生成通知的目录上设置监视器。然后处理收到通知的每个文件。既然您使用JDK 5,我建议使用jpathwatch。请注意,在尝试处理文件之前,需要确保文件写入已完成。启动监视器以确保处理每个新文件后,一次性使用文件列表来处理当前内容

  5. # 5 楼答案

    使用FileFilter(或FilenameFilter)编写为只接受一次,例如:

    File dir = new File("/some/dir");
    File[] files = dir.listFiles(new FileFilter() {
        boolean first = true;
        public boolean accept(final File pathname) {
            if (first) {
                first = false;
                return true;
            }
            return false;
        }
    });
    
  6. # 6 楼答案

    如果我们看一下文件系统类,它归结为文件系统访问,只有list方法,因此在“纯”JAVA中,除了在字符串数组中列出它们之外,似乎没有其他方法来选择文件