我需要对文件列表应用更复杂的逻辑.具体来说,在应用软件更新时,我想对从更新zip归档文件中获取的文件执行此操作:
>让updateFile为更新档案中的文件,originalFile为当前版本文件,backupFile为原始文件的备份
>如果originalFile与当前运行的jar文件相同,请跳过它
>如果updateFile的父目录是特定名称,请跳过它(例如,包含用户数据的目录)
我希望有一些选项,例如为每个文件运行回调:
GreatFileLibrary.forEveryChildOf(new File("my path"),
(File child)->{ ... logic here ... });
如果不是这样,那么至少只需获取某个Collection中的所有文件并循环遍历即可:
Iterable files = GreatFileLibrary.listChildren(new File("my path"));
for(File child:files) {
... logic ...
}
前者可以让我显示进度(由于知道列表的长度),但是我坦率地认为更新几乎是即时的.
文件当然可以返回一些子列表,因此,超级幼稚的方法是:
/** Returns list of all child files, recursively. **/
public static Iterable listFileChildren(File parent, ArrayList list) {
File[] files = parent.listFiles();
for(File file:files) {
list.add(file);
if(file.isDirectory())
listFileChildren(file, list);
}
return list;
}
public static Iterable listFileChildren(File parent) {
return listFileChildren(parent, new ArrayList());
}
内置的Java 8库可以做得更好吗?我的快速代码是否有缺陷?我真的很希望删除将File []转换为Iterable< File>的过程.就像我的代码一样,这很脏.
解决方法:
在代码中创建列表将最耗时,因此请尝试避免使用它.
一个简单的方法是:
public void forEveryChildOf(File file) {
for(File child:file.listFiles())
doForEach(file,child);
}
private void doForEach(File topParent,File child){
if(child.isFile())
System.out.println("Do logic");
if(child.isDirectory())
for(File subchild:child.listFiles())
doForEach(topParent,subchild);
}
标签:file,java
来源: https://codeday.me/bug/20191119/2034255.html