Java 正在查找具有特定名称的上次修改的文件?
我正在尝试查找文件的最后修改版本,但当我尝试查找某个文件时,我得到了一个Java 正在查找具有特定名称的上次修改的文件?,java,sorting,file-io,Java,Sorting,File Io,我正在尝试查找文件的最后修改版本,但当我尝试查找某个文件时,我得到了一个NULLPointerException。我的代码: public static File getFile(String dir, String chat) { File fl = new File(dir); File[] files = fl.listFiles(new FileFilter() { public boolean accept(File file) {
NULLPointerException
。我的代码:
public static File getFile(String dir, String chat) {
File fl = new File(dir);
File[] files = fl.listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isFile();
}
});
long lastMod = Long.MIN_VALUE;
File choice = null;
for (File file : files) {
if (file.lastModified() > lastMod && file.getName().contains(chat)) {
choice = file;
lastMod = file.lastModified();
}
}
return choice;
}
当您将“&&file.getName().contains(chat)”取出时,代码会起作用。否则,它会给我NullPointerException错误
我知道这样做是可行的,因为我已经让它工作了,但需要从头开始编写代码:(这里是NullPointerException的来源
File choice = null;
在这里调用-->choice=file之前,需要实例化它
File choice = new File(dir);
以下是使用java.nio.file的版本:
public static Path getMostRecent(final String dir, final String chat)
throws IOException
{
final Path dirpath = Paths.get(dir).toAbsolutePath();
Path ret = null;
FileTime mostRecent = FileTime.fromMillis(0L); // Jan 1st 1970, 00:00:00 GMT
FileTime current;
final DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<>()
{
@Override
public boolean accept(final Path entry)
{
return Files.isRegularFile(entry)
&& entry.getFileName().toString().contains(chat);
}
};
for (final Path entry: Files.newDirectoryStream(dirpath, filter)) {
current = Files.getLastModifiedTime(entry);
if (current.compareTo(mostRecent) > 0) {
mostRecent = current;
ret = entry;
}
}
return entry;
}
公共静态路径getMostRecent(最终字符串目录,最终字符串聊天)
抛出IOException
{
最终路径dirpath=Path.get(dir.toabsolutionPath();
路径ret=null;
FileTime mostRecent=FileTime.fromMillis(0L);//1970年1月1日,00:00:00GMT
文件时电流;
final DirectoryStream.Filter Filter=新的DirectoryStream.Filter()
{
@凌驾
公共布尔接受(最终路径条目)
{
返回文件.isRegularFile(条目)
&&entry.getFileName().toString()包含(聊天);
}
};
for(最终路径条目:Files.newDirectoryStream(dirpath,filter)){
当前=文件。getLastModifiedTime(条目);
如果(当前比较(最大百分比)>0){
mostRecent=当前;
ret=输入;
}
}
返回条目;
}
如果您使用Java 8:
public static Path getMostRecent(final String dir, final String chat)
throws IOException
{
final Path dirpath = Paths.get(dir).toAbsolutePath();
try (
final Stream<Path> entries = Files.list(dirpath);
) {
return entries.filter(Files::isRegularFile)
.filter(entry -> entry.getFileName().toString().contains(chat))
.sorted(Comparator.comparing(Files::getLastModifiedTime).reversed())
.findFirst().orElse(null);
}
}
公共静态路径getMostRecent(最终字符串目录,最终字符串聊天)
抛出IOException
{
最终路径dirpath=Path.get(dir.toabsolutionPath();
试一试(
最终流条目=Files.list(dirpath);
) {
返回条目.filter(文件::isRegularFile)
.filter(条目->条目.getFileName().toString().contains(聊天))
.sorted(Comparator.comparing(Files::getLastModifiedTime).reversed())
.findFirst().orElse(null);
}
}
什么是NullPointerException?这就是它给我的全部..是的,NullPointerException
在哪里被调用?你能给出堆栈跟踪吗?@ElliottFrisch我真的不相信这个问题与你所指的是重复的,我怀疑聊天
是null
。这会引发NPE。还有另一个可能的问题PE:.listFiles()
我不同意,因为用户说除非他在下面的循环中进行了更改,否则它是有效的,因此错误必须在循环中。但是,这可能是NPE。请尝试并.listFiles()
在一个您无法读取条目的目录上;或者从一个非目录的文件上……有很多其他方法可以改进此基本代码,但在尝试抛出一个通用方法之前,解决此代码中的问题很重要。我知道您希望您的答案突出,但我的目标是clarit是的,正是用户需要的地方。谢谢。这并不是我想让我的答案脱颖而出。但在2015年使用File
是一种挑战。不幸的是,Android用户没有选择,但OP使用的是Java 7+。