- 本文承接《org.apache.commons.io.FileUtils 详解1》,需要开发包,可以参考它。
listFiles
- listFiles 方法用于迭代遍历获取指定目录下的所有文件,包含子孙目录。
- listFiles 方法能在遍历获取的时候进行过滤,比如只获取文件名以 某某开头的,或者获取文件名以某某结尾的,或者是文件大小大于等于某某 的等等。
- 重载了如下两个方法,其中第二个底层也是调用的第一个方法。
- public static Collection<File> listFiles( final File directory, final IOFileFilter fileFilter, final IOFileFilter dirFilter)
- public static Collection<File> listFiles( final File directory, final String[] extensions, final boolean recursive)
- 参数说明:
- directory:被遍历的目录,必须是已经存在的目录,否则报错
- fileFilter:文件过滤器,IOFileFilter 是一个接口,常用的实现类有:SuffixFileFilter(文件后缀过滤器)、PrefixFileFilter(文件前缀过滤器)、TrueFileFilter(总是返回true的文件过滤器)、FalseFileFilter(总是返回false的文件过滤器)
- dirFilter:与上面同理
- extensions:如果为 null ,则底层用的是 TrueFileFilter.INSTANCE,否则用的是 new SuffixFileFilter(suffixes)
- recursive:如果为 true,则底层用的是 TrueFileFilter.INSTANCE,否则 false 时 用 FalseFileFilter.INSTANCE
- 如下所示为 listFiles( final File directory, final String[] extensions, final boolean recursive) 的源码:
/**
* Finds files within a given directory (and optionally its subdirectories)
* which match an array of extensions.
*
* @param directory the directory to search in
* @param extensions an array of extensions, ex. {"java","xml"}. If this
* parameter is {@code null}, all files are returned.
* @param recursive if true all subdirectories are searched as well
* @return a collection of java.io.File with the matching files
*/
public static Collection<File> listFiles(
final File directory, final String[] extensions, final boolean recursive) {
IOFileFilter filter;
if (extensions == null) {
filter = TrueFileFilter.INSTANCE;
} else {
final String[] suffixes = toSuffixes(extensions);
filter = new SuffixFileFilter(suffixes);
}
return listFiles(directory, filter,
recursive ? TrueFileFilter.INSTANCE : FalseFileFilter.INSTANCE);
}
遍历目录下的所有文件
- 包含所有子孙文件
package www.wmx.com.utils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;
import java.io.File;
import java.util.Collection;
/**
* Created by Administrator on 2018/8/30 0030.
* 自定义文件工具类
*/
public class FileWmxUtils {
public static void main(String[] args) {
File fileDir = new File("E:\\gxg\\resources");
loopDir2(fileDir);
}
/**
* 遍历目录下的所有文件--方式1
*
* @param targetDir
*/
public static void loopDir1(File targetDir) {
if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
/**
* targetDir:不要为 null、不要是文件、不要不存在
* 第二个 文件过滤 参数如果为 FalseFileFilter.FALSE ,则不会查询任何文件
* 第三个 目录过滤 参数如果为 FalseFileFilter.FALSE , 则只获取目标文件夹下的一级文件,而不会迭代获取子文件夹下的文件
*/
Collection<File> fileCollection = FileUtils.listFiles(targetDir,
TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
for (File file : fileCollection) {
System.out.println(">>> " + file.getPath());
}
}
}
/**
* 遍历目录下的所有文件--方式2
*
* @param targetDir
*/
public static void loopDir2(File targetDir) {
if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
/**
* targetDir:不要为 null、不要是文件、不要不存在
* 第二个 文件过滤 参数为 null 时,底层就是 TrueFileFilter.INSTANCE;
* 第三个 目录过滤 参数为 true 时,底层就是 recursive ? TrueFileFilter.INSTANCE : FalseFileFilter.INSTANCE);
*/
Collection<File> fileCollection = FileUtils.listFiles(targetDir, null, true);
for (File file : fileCollection) {
System.out.println(">>> " + file.getPath());
}
}
}
}
控制台输出:
>>> E:\gxg\resources\docs\info\springmvc.txt
>>> E:\gxg\resources\docs\info\SYSTEM_REQUIREMENTS.txt
>>> E:\gxg\resources\docs\info\Welcome to the Apache Solr project.txt
>>> E:\gxg\resources\docs\info\什么是全文检索 java.txt
>>> E:\gxg\resources\docs\info\全文检索.txt
>>> E:\gxg\resources\docs\overview-tree.html
>>> E:\gxg\resources\docs\package-list
>>> E:\gxg\resources\docs\script.js
>>> E:\gxg\resources\docs\serialized-form.html
>>> E:\gxg\resources\docs\stylesheet.cssProcess finished with exit code 0
遍历以指定字符开头的文件
- 遍历获取目录下所有子孙文件中以指定字符开头的文件
package www.wmx.com.utils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.PrefixFileFilter;
import org.apache.commons.io.filefilter.TrueFileFilter;
import java.io.File;
import java.util.Collection;
/**
* Created by Administrator on 2018/8/30 0030.
* 自定义文件工具类
*/
public class FileWmxUtils {
public static void main(String[] args) {
File fileDir = new File("E:\\gxg\\resources\\docs");
/**查询目标目录下所有以 "s" 和 "什么" 开头的文件 */
String[] prefixs = new String[]{"s", "什么"};
loopDir3(fileDir, prefixs);
}
/**
* 遍历目录下所有以指定字符开头的文件----方式1
*
* @param targetDir 不要为 null、不要是文件、不要不存在
* @param prefixs 文件前缀,支持多个,当为 null 时,表示不过滤
*/
public static void loopDir3(File targetDir, String[] prefixs) {
if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
PrefixFileFilter prefixFileFilter = null;
if (prefixs != null) {
prefixFileFilter = new PrefixFileFilter(prefixs);
} else {
prefixFileFilter = new PrefixFileFilter("");
}
/**
* targetDir:不要为 null、不要是文件、不要不存在
* 第二个参数 文件过滤
* 1)PrefixFileFilter:为文件名前缀过滤器
* 2)PrefixFileFilter 构造器参数可以是 String、List<String>、String[] 等
* 3)如果参数为空,则表示不进行过滤,等同于 TrueFileFilter.INSTANCE
*
* 第三个参数 目录过滤
* TrueFileFilter.INSTANCE:表示迭代获取所有子孙目录
* FalseFileFilter.FALSE:表示只获取目标目录下一级,不进行迭代
*/
Collection<File> fileCollection = FileUtils.listFiles(targetDir, prefixFileFilter, TrueFileFilter.INSTANCE);
for (File file : fileCollection) {
System.out.println(">>> " + file.getPath());
}
}
}
}
控制台输出:
>>> E:\gxg\resources\docs\info\springmvc.txt
>>> E:\gxg\resources\docs\info\什么是全文检索 java.txt
>>> E:\gxg\resources\docs\script.js
>>> E:\gxg\resources\docs\serialized-form.html
>>> E:\gxg\resources\docs\stylesheet.cssProcess finished with exit code 0
遍历以指定字符结尾的文件
package www.wmx.com.utils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.PrefixFileFilter;
import org.apache.commons.io.filefilter.SuffixFileFilter;
import org.apache.commons.io.filefilter.TrueFileFilter;
import java.io.File;
import java.util.Collection;
/**
* Created by Administrator on 2018/8/30 0030.
* 自定义文件工具类
*/
public class FileWmxUtils {
public static void main(String[] args) {
File fileDir = new File("E:\\gxg\\resources\\docs");
/**查询目标目录下所有以 "html" 和 ".css" 结尾的文件 */
String[] suffixs = new String[]{"html",".css"};
loopDir4(fileDir, suffixs);
}
/**
* 遍历目录下所有以指定字符结尾的文件----方式1
*
* @param targetDir 不要为 null、不要是文件、不要不存在
* @param suffixs 文件后缀,支持多个,当为 null 时,表示不过滤
*/
public static void loopDir4(File targetDir, String[] suffixs) {
if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
/**
* SuffixFileFilter 指定的后缀可以是任意字符,如文件 overview-tree.html,后缀过滤器字符 html、.html、tree.html 等都能匹配
* */
SuffixFileFilter suffixFileFilter = null;
if (suffixs != null) {
suffixFileFilter = new SuffixFileFilter(suffixs);
} else {
suffixFileFilter = new SuffixFileFilter("");
}
/**
* targetDir:不要为 null、不要是文件、不要不存在
* 第二个参数 文件过滤
* 1)SuffixFileFilter:为文件名后缀过滤器
* 2)SuffixFileFilter 构造器参数可以是 String、List<String>、String[] 等
* 3)如果参数为空,则表示不进行过滤,等同于 TrueFileFilter.INSTANCE
*
* 第三个参数 目录过滤
* TrueFileFilter.INSTANCE:表示迭代获取所有子孙目录
* FalseFileFilter.FALSE:表示只获取目标目录下一级,不进行迭代
*/
Collection<File> fileCollection = FileUtils.listFiles(targetDir, suffixFileFilter, TrueFileFilter.INSTANCE);
for (File file : fileCollection) {
System.out.println(">>> " + file.getPath());
}
}
}
/**
* 遍历目录下所有指定后缀名结尾的文件----方式2
*
* @param targetDir :不要为 null、不要是文件、不要不存在
* @param suffixs :与 SuffixFileFilter 不同 ,此时只能是文件后缀名;如 文件 overview-tree.html,suffixs 为 html 才能匹配上,.html 则不能匹配
* 因为 listFiles 底层自动加了 "."
*/
public static void loopDir5(File targetDir, String[] suffixs) {
if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
/**
* targetDir:不要为 null、不要是文件、不要不存在
* 第二个 文件过滤 参数为 null 时,底层就是 TrueFileFilter.INSTANCE;
* 第三个 目录过滤 参数为 true 时,底层就是 recursive ? TrueFileFilter.INSTANCE : FalseFileFilter.INSTANCE);
*/
Collection<File> fileCollection = FileUtils.listFiles(targetDir, suffixs, true);
for (File file : fileCollection) {
System.out.println(">>> " + file.getPath());
}
}
}
}
控制台输出:
>>> E:\gxg\resources\docs\overview-tree.html
>>> E:\gxg\resources\docs\serialized-form.html
>>> E:\gxg\resources\docs\stylesheet.cssProcess finished with exit code 0
遍历文件大小范围内的文件
package www.wmx.com.utils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.PrefixFileFilter;
import org.apache.commons.io.filefilter.SizeFileFilter;
import org.apache.commons.io.filefilter.SuffixFileFilter;
import org.apache.commons.io.filefilter.TrueFileFilter;
import java.io.File;
import java.util.Collection;
/**
* Created by Administrator on 2018/8/30 0030.
* 自定义文件工具类
*/
public class FileWmxUtils {
public static void main(String[] args) {
File fileDir = new File("E:\\gxg\\resources\\docs");
/**查询目标目录下 文件大小 为 5KB 及以上的文件*/
loopDir6(fileDir, 5 * 1024L, true);
}
/**
* 遍历目录下所有大于或者小于指定大小的文件
*
* @param targetDir 不要为 null、不要是文件、不要不存在
* @param fileSize 文件判断大小,单位 字节
* @param acceptLarger 为 true,则表示获取 大于等于 fileSize 的文件
* 为 false ,则表示获取 小于 fileSize 的文件
*/
public static void loopDir6(File targetDir, Long fileSize, boolean acceptLarger) {
if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
/**
* SizeFileFilter(final long size, final boolean acceptLarger)
* 1)文件大小过滤器
* 2)size,表示判断的依据点
* 3)acceptLarger:为 true,则表示获取 大于等于 size 的文件
* 为 false ,则表示获取 小于 size 的文件
* 4)单位是字节
*/
SizeFileFilter sizeFileFilter = new SizeFileFilter(fileSize, acceptLarger);
Collection<File> fileCollection = FileUtils.listFiles(targetDir, sizeFileFilter, TrueFileFilter.INSTANCE);
for (File file : fileCollection) {
System.out.println(">>> " + file.getPath() + "\t" + file.length() +
"\t" + FileUtils.byteCountToDisplaySize(file.length()));
}
}
}
}
控制台输出:
>>> E:\gxg\resources\docs\info\Welcome to the Apache Solr project.txt 5464 5 KB
>>> E:\gxg\resources\docs\overview-tree.html 44538 43 KB
>>> E:\gxg\resources\docs\serialized-form.html 39403 38 KB
>>> E:\gxg\resources\docs\stylesheet.css 12842 12 KBProcess finished with exit code 0
FileWmxUtils
- 整个文件内容:
package www.wmx.com.utils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.PrefixFileFilter;
import org.apache.commons.io.filefilter.SizeFileFilter;
import org.apache.commons.io.filefilter.SuffixFileFilter;
import org.apache.commons.io.filefilter.TrueFileFilter;
import java.io.File;
import java.util.Collection;
/**
* Created by Administrator on 2018/8/30 0030.
* 自定义文件工具类
*/
public class FileWmxUtils {
public static void main(String[] args) {
File fileDir = new File("E:\\gxg\\resources\\docs");
/**查询目标目录下 文件大小 为 5KB 及以上的文件*/
loopDir6(fileDir, 5 * 1024L, true);
}
/**
* 遍历目录下的所有文件--方式1
*
* @param targetDir
*/
public static void loopDir1(File targetDir) {
if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
/**
* targetDir:不要为 null、不要是文件、不要不存在
* 第二个 文件过滤 参数如果为 FalseFileFilter.FALSE ,则不会查询任何文件
* 第三个 目录过滤 参数如果为 FalseFileFilter.FALSE , 则只获取目标文件夹下的一级文件,而不会迭代获取子文件夹下的文件
*/
Collection<File> fileCollection = FileUtils.listFiles(targetDir,
TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
for (File file : fileCollection) {
System.out.println(">>> " + file.getPath());
}
}
}
/**
* 遍历目录下的所有文件--方式2
*
* @param targetDir
*/
public static void loopDir2(File targetDir) {
if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
/**
* targetDir:不要为 null、不要是文件、不要不存在
* 第二个 文件过滤 参数为 null 时,底层就是 TrueFileFilter.INSTANCE;
* 第三个 目录过滤 参数为 true 时,底层就是 recursive ? TrueFileFilter.INSTANCE : FalseFileFilter.INSTANCE);
*/
Collection<File> fileCollection = FileUtils.listFiles(targetDir, null, true);
for (File file : fileCollection) {
System.out.println(">>> " + file.getPath());
}
}
}
/**
* 遍历目录下所有以指定字符开头的文件----方式1
*
* @param targetDir 不要为 null、不要是文件、不要不存在
* @param prefixs 文件前缀,支持多个,当为 null 时,表示不过滤
*/
public static void loopDir3(File targetDir, String[] prefixs) {
if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
PrefixFileFilter prefixFileFilter = null;
if (prefixs != null) {
prefixFileFilter = new PrefixFileFilter(prefixs);
} else {
prefixFileFilter = new PrefixFileFilter("");
}
/**
* targetDir:不要为 null、不要是文件、不要不存在
* 第二个参数 文件过滤
* 1)PrefixFileFilter:为文件名前缀过滤器
* 2)PrefixFileFilter 构造器参数可以是 String、List<String>、String[] 等
* 3)如果参数为空,则表示不进行过滤,等同于 TrueFileFilter.INSTANCE
*
* 第三个参数 目录过滤
* TrueFileFilter.INSTANCE:表示迭代获取所有子孙目录
* FalseFileFilter.FALSE:表示只获取目标目录下一级,不进行迭代
*/
Collection<File> fileCollection = FileUtils.listFiles(targetDir, prefixFileFilter, TrueFileFilter.INSTANCE);
for (File file : fileCollection) {
System.out.println(">>> " + file.getPath());
}
}
}
/**
* 遍历目录下所有以指定字符结尾的文件----方式1
*
* @param targetDir 不要为 null、不要是文件、不要不存在
* @param suffixs 文件后缀,支持多个,当为 null 时,表示不过滤
*/
public static void loopDir4(File targetDir, String[] suffixs) {
if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
/**
* SuffixFileFilter 指定的后缀可以是任意字符,如文件 overview-tree.html,后缀过滤器字符 html、.html、tree.html 等都能匹配
* */
SuffixFileFilter suffixFileFilter = null;
if (suffixs != null) {
suffixFileFilter = new SuffixFileFilter(suffixs);
} else {
suffixFileFilter = new SuffixFileFilter("");
}
/**
* targetDir:不要为 null、不要是文件、不要不存在
* 第二个参数 文件过滤
* 1)SuffixFileFilter:为文件名后缀过滤器
* 2)SuffixFileFilter 构造器参数可以是 String、List<String>、String[] 等
* 3)如果参数为空,则表示不进行过滤,等同于 TrueFileFilter.INSTANCE
*
* 第三个参数 目录过滤
* TrueFileFilter.INSTANCE:表示迭代获取所有子孙目录
* FalseFileFilter.FALSE:表示只获取目标目录下一级,不进行迭代
*/
Collection<File> fileCollection = FileUtils.listFiles(targetDir, suffixFileFilter, TrueFileFilter.INSTANCE);
for (File file : fileCollection) {
System.out.println(">>> " + file.getPath());
}
}
}
/**
* 遍历目录下所有指定后缀名结尾的文件----方式2
*
* @param targetDir :不要为 null、不要是文件、不要不存在
* @param suffixs :与 SuffixFileFilter 不同 ,此时只能是文件后缀名;如 文件 overview-tree.html,suffixs 为 html 才能匹配上,.html 则不能匹配
* 因为 listFiles 底层自动加了 "."
*/
public static void loopDir5(File targetDir, String[] suffixs) {
if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
/**
* targetDir:不要为 null、不要是文件、不要不存在
* 第二个 文件过滤 参数为 null 时,底层就是 TrueFileFilter.INSTANCE;
* 第三个 目录过滤 参数为 true 时,底层就是 recursive ? TrueFileFilter.INSTANCE : FalseFileFilter.INSTANCE);
*/
Collection<File> fileCollection = FileUtils.listFiles(targetDir, suffixs, true);
for (File file : fileCollection) {
System.out.println(">>> " + file.getPath());
}
}
}
/**
* 遍历目录下所有大于或者小于指定大小的文件
*
* @param targetDir 不要为 null、不要是文件、不要不存在
* @param fileSize 文件判断大小,单位 字节
* @param acceptLarger 为 true,则表示获取 大于等于 fileSize 的文件
* 为 false ,则表示获取 小于 fileSize 的文件
*/
public static void loopDir6(File targetDir, Long fileSize, boolean acceptLarger) {
if (targetDir != null && targetDir.exists() && targetDir.isDirectory()) {
/**
* SizeFileFilter(final long size, final boolean acceptLarger)
* 1)文件大小过滤器
* 2)size,表示判断的依据点
* 3)acceptLarger:为 true,则表示获取 大于等于 size 的文件
* 为 false ,则表示获取 小于 size 的文件
* 4)单位是字节
*/
SizeFileFilter sizeFileFilter = new SizeFileFilter(fileSize, acceptLarger);
Collection<File> fileCollection = FileUtils.listFiles(targetDir, sizeFileFilter, TrueFileFilter.INSTANCE);
for (File file : fileCollection) {
System.out.println(">>> " + file.getPath() + "\t" + file.length() +
"\t" + FileUtils.byteCountToDisplaySize(file.length()));
}
}
}
}