gpt4 book ai didi

java - 将 commons.io FileUtils.listFiles 替换为 nio

转载 作者:行者123 更新时间:2023-12-01 12:57:09 24 4
gpt4 key购买 nike

我需要替换 commons.io FileUtils.listFiles 因为处理大目录非常慢。我读到 java nio 更快。我的问题是,如何用nio替换这个方法:

public List<File> listFiles(){
File dir = new File(this._dir);
List<File> files = (List<File>) FileUtils.listFiles(dir, this.get_extensions(), true);

return files;
}

谢谢!!

执行以下测试:

public List<File> listFiles(){
File dir = new File(this._dir);
Path dire = FileSystems.getDefault().getPath( this._dir );
long start = System.currentTimeMillis();
try {
Files.walkFileTree(dire, new FileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
return FileVisitResult.CONTINUE;
}

@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
// here you have the files to process
if (file.toString().endsWith("IDC.xml")) {
System.out.println(file);

}
return FileVisitResult.CONTINUE;
}

@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.TERMINATE;
}

@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long stop = System.currentTimeMillis();
System.out.println( "NIO: " + (stop - start) + " ms" );
start = System.currentTimeMillis();
List<File> files = (List<File>) FileUtils.listFiles(dir, this.get_extensions(), true);
stop = System.currentTimeMillis();
System.out.println( "IO: " + (stop - start) + " ms" );
return files;
}

nio的时间比io短。

<小时/>

我找到了下一个解决方案:

public List<String> listFiles(){
File dir = new File(this._dir);
Path dire = FileSystems.getDefault().getPath( this._dir );
long start = System.currentTimeMillis();
try {
Files.walkFileTree(dire, new FindTextFilesVisitor());
} catch (IOException e) {
e.printStackTrace();
}
long stop = System.currentTimeMillis();
System.out.println( "NIO: " + (stop - start) + " ms" );

return this._lista;
}
public Boolean changeString( String str ) {
this._lista.add(str);
return true;
}
/**
* FindTextFilesVisitor.
*/
public class FindTextFilesVisitor extends SimpleFileVisitor<Path> {
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs)
throws IOException {
if (file.toString().endsWith("IDC.xml")) {
System.out.println(file.getParent());
changeString(file.getParent().toString());
}
return FileVisitResult.CONTINUE;
}
}

最佳答案

使用 NIO2,您可以创建一个流,这样就不会将所有内容都保存在内存中。所以,您可能想做这样的事情:

DirectoryStream.Filter<Path> pathFilter = ...
try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(Paths.get(directory), pathFilter)) {
for (Path path : directoryStream) {
...
}
} catch (IOException ex) {}

请注意,不要将流转换为列表,这一点很重要,否则还有什么意义,对吧?因此,您可能也应该更改您的方法签名。

关于java - 将 commons.io FileUtils.listFiles 替换为 nio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23784587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com