标签:java file-io java-7 directory-content
我已经使用旧的,过时的java.io.File.listFiles()
太久了.
表现不太好.它是:
>价格昂贵,因为它为每个条目创建了一个新的File
对象.
>慢,因为在开始处理之前必须等待阵列完成.
>非常糟糕,特别是如果您只需要处理内容的子集.
有哪些替代方案?
解决方法:
Java 7的java.nio.file
软件包可用于增强性能.
迭代器
DirectoryStream<T>
接口可用于迭代目录而无需将其内容预加载到内存中.
虽然旧API在文件夹中创建了所有文件名的数组,但新方法在迭代期间遇到它时会加载每个文件名(或有限大小的缓存文件名组).
要获取表示给定Path
的实例,可以调用Files.newDirectoryStream(Path)
静态方法.
我建议你使用try-with-resources语句来正确关闭流,但如果你不能,请记得在DirectoryStream<T>.close()
结束时手动完成.
Path folder = Paths.get("...");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(folder)) {
for (Path entry : stream) {
// Process the entry
}
} catch (IOException ex) {
// An I/O problem has occurred
}
过滤器
DirectoryStream.Filter<T>
接口可用于在迭代期间跳过条目组.
由于它是@FunctionalInterface
,从Java 8开始,您可以使用lambda表达式实现它,覆盖Filter<T>.accept(T)
方法,该方法决定是应该接受还是过滤给定的目录条目.然后,您将使用Files.newDirectoryStream(Path, DirectoryStream.Filter<? super Path>)
静态方法与新创建的实例.
或者您可能更喜欢使用Files.newDirectoryStream(Path, String)
静态方法,它可以用于简单的文件名匹配.
Path folder = Paths.get("...");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(folder, "*.txt")) {
for (Path entry : stream) {
// The entry can only be a text file
}
} catch (IOException ex) {
// An I/O problem has occurred
}
Path folder = Paths.get("...");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(folder,
entry -> Files.isDirectory(entry))) {
for (Path entry : stream) {
// The entry can only be a directory
}
} catch (IOException ex) {
// An I/O problem has occurred
}
标签:java,file-io,java-7,directory-content 来源: https://codeday.me/bug/20190928/1829717.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。