我有一些批处理程序应该从目录中获取文件并进行处理。
由于这个程序应该:
... 只从目录中选择一个文件的最佳方法是什么 - 不使用 File.list()
(可能是数百个文件)?
答案 0 :(得分:7)
在Java 7中,您可以使用DirectoryStream,但在Java 5中,获取目录条目的唯一方法是list()
和listFiles()
。
请注意,列出包含数百个文件的目录并不理想,但与处理其中一个文件相比,这可能没什么大不了的。但是,一旦目录包含数千个文件,它可能会开始出现问题。
答案 1 :(得分:2)
从您所说的内容看来,您希望一次处理目录中的每个文件(包括添加到目录中的文件)。您可以执行以下操作:在添加文件时生成通知的目录上设置监视器。然后处理您收到通知的每个文件。由于您使用的是JDK 5,我建议使用jpathwatch。请注意,在尝试处理文件之前,您需要确保文件已完成。启动监视器以确保您将处理每个新文件后,请一次性使用文件列表来处理当前内容。
答案 2 :(得分:1)
使用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;
}
});
答案 3 :(得分:0)
在Java 1.5上没有好的解决方案,你可以使用过滤器只获得1个文件,但是java只会返回一个文件,但无论如何都会解析所有文件。如果您不需要实际的文件对象,可以尝试Runtime.getRuntime().exec("dir")
在\n
上拆分返回的字符串并打印出第一行:-P
答案 4 :(得分:0)
编辑:我的实现使用.list(),因为你说它不会,但它可能会有一些价值:)
如果查看File实现,public String [] list()方法似乎比File [] 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;
}
来自File.class
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;
}
答案 5 :(得分:0)
如果看一下它归结为文件系统访问的类类FileSystem,那么只有list方法,所以在“纯”JAVA中似乎没有其他方法可以选择文件而不是在字符串中列出所有文件阵列。