列出目录并获取Java中每个文件的URL的最快可能性

Aha*_*gar 5 java url file

我打算执行标准列表命令来获取目录内容的向量或列表.

我知道这很容易使用

File f = new File("C:/testDir");
File[] files = f.listFiles();
Run Code Online (Sandbox Code Playgroud)

问题是我需要一个列表/数组/向量的URL.所以我的想法是将文件转换为URL.使用org.apache.commons.io.FileUtils库,可以使用以下简单代码:

URL[] urls = FileUtils.toURLs(files);
Run Code Online (Sandbox Code Playgroud)

这正是我所需要的,但遗憾的是很慢(特别是对于包含数千个文件的目录),尽管它只是使用for循环并使用"toURL()"方法解析每个File对象.

有人知道以更好的方式完成这项任务的方法吗?

Pet*_*ese 8

唯一简单的优化就是减少对象创建,这将对性能进行适度的改进.而不是使用listFiles()创建一大堆File对象,而是使用list()获取仅包含文件名而不是路径的String数组,并直接创建URL.在这种情况下,字符串创建和存储将具有较少的对象开销.字符串操作显然可以更快,更合适,尽管它可能不会产生巨大的差异.

就像是:

ArrayList<URL> urls = new ArrayList<URL>(); //or use an array if you prefer.
for(String name: f.files())
    urls.add(new URL("file://"+f.getPath()+"/"+name));
Run Code Online (Sandbox Code Playgroud)

  • +1.此外,我检查了这一点,发现使用构造函数新URL("file",f.getPath(),name)仍然改进了这种方法的性能. (2认同)
  • 通过在调用new ArrayList <URL>(files.size())时传入正确的大小,可能会获得微小的收益; 这将避免在主循环中重新分配底层数组. (2认同)
  • 4096个文件测试.与旧版本的时间:~13500毫秒; 时间与上述解决方案:2250毫秒; 我认为这种加速应该有效. (2认同)