如何使用Java从目录中仅获取10个最后修改的文件?

如何使用Java从目录中仅获取10个最后修改的文件?,java,Java,我是初学者,我发现了一个关于java中最近修改的文件的老线索。 我想要的是从一个目录中只获取10个最近的文件,然后将它们移动到另一个目录 此论坛中的代码运行良好,但它从一个目录中获取所有文件并按日期排序 任何帮助都将受到感谢, 多谢各位 代码如下: import java.io.File; import java.util.Arrays; import java.util.Comparator; public class Newest { public static void mai

我是初学者,我发现了一个关于java中最近修改的文件的老线索。 我想要的是从一个目录中只获取10个最近的文件,然后将它们移动到另一个目录

此论坛中的代码运行良好,但它从一个目录中获取所有文件并按日期排序

任何帮助都将受到感谢, 多谢各位

代码如下:

import java.io.File;
import java.util.Arrays;
import java.util.Comparator;


public class Newest {
    public static void main(String[] args) {
        File dir = new File("C:\\your\\dir");
        File [] files  = dir.listFiles();
        Arrays.sort(files, new Comparator(){
            public int compare(Object o1, Object o2) {
                return compare( (File)o1, (File)o2);
            }
            private int compare( File f1, File f2){
                long result = f2.lastModified() - f1.lastModified();
                if( result > 0 ){
                    return 1;
                } else if( result < 0 ){
                    return -1;
                } else {
                    return 0;
                }
            }
        });
        System.out.println( Arrays.asList(files ));
    }
}
导入java.io.File;
导入java.util.array;
导入java.util.Comparator;
公开课最新{
公共静态void main(字符串[]args){
文件目录=新文件(“C:\\your\\dir”);
File[]files=dir.listFiles();
Arrays.sort(文件,新的Comparator(){
公共整数比较(对象o1、对象o2){
返回比较((文件)o1,(文件)o2);
}
专用整数比较(文件f1、文件f2){
长结果=f2.lastModified()-f1.lastModified();
如果(结果>0){
返回1;
}否则如果(结果<0){
返回-1;
}否则{
返回0;
}
}
});
System.out.println(Arrays.asList(files));
}
}

我是新手,如果在论坛上犯了一些错误,我很抱歉

所以对我来说,我不知道如何在新代码中插入上述内容

如果我保留第一个代码,我想将10个最近的文件存储到另一个文件夹中, 我尝试了这个,但它将所有文件都放在目录中

需要帮忙吗

多谢各位

import java.io.File;
import java.util.Arrays;
import java.util.Comparator;
import java.io.*;
import java.text.*;
import java.util.*;




    public class Newest
    {
        public static void main(String[] args)
        {
            File dir = new File("c:\\File");
            File[] files = dir.listFiles();
            Arrays.sort(files, new Comparator<File>()
            {
                public int compare(File f1, File f2)
                {
                    return Long.valueOf(f2.lastModified()).compareTo
                            (
                            f1.lastModified());
                }
            });
            //System.out.println(Arrays.asList(files));
            for(int i=0, length=Math.min(files.length, 12); i<length; i++) {
        System.out.println(files[i]);


    for (File f : files) {
            System.out.println(f.getName() + " " + sdf.format(new Date(f.lastModified())));
            File dir = new File("c://Target");
            boolean success = f.renameTo(new File(dir,f.getName()));
            if (!success)


            }
        }
    } 
导入java.io.File;
导入java.util.array;
导入java.util.Comparator;
导入java.io.*;
导入java.text.*;
导入java.util.*;
公开课最新
{
公共静态void main(字符串[]args)
{
文件目录=新文件(“c:\\File”);
File[]files=dir.listFiles();
Arrays.sort(文件,新的Comparator()
{
公共整数比较(文件f1、文件f2)
{
返回Long.valueOf(f2.lastModified()).compareTo
(
f1.lastModified());
}
});
//System.out.println(Arrays.asList(files));

对于(inti=0,length=Math.min(files.length,12);在代码示例中,i更改:

System.out.println( Arrays.asList(files ));
致:


for(int i=0,length=Math.min(files.length,10);i操作系统在请求文件时不采用排序例程。因此,唯一的解决方案是抓取所有文件(以确保不会跳过所需文件之一)并自行排序

文件系统通常提供基于文件名抓取文件的例程,Java通过采用
FileFilter
参数的
列表(…)
公开了这一点


在Java1.7中(无论何时发布),有了新的面向文件的工具,您可以访问底层文件系统的抽象。有了这些工具,您可以创建一个文件访问者,但这对情况没有多大帮助,因为您不知道在不查看其修改时间的情况下可以跳过哪些文件。这意味着即使使用作为一个访问界面,您仍然需要检查每个文件的修改时间,以确保您没有错过所需的十个文件中的一个。

获取所有文件,然后按照规范对其进行排序是唯一“正确”的方法。但这里有另一种方法,它使用文件过滤器作为访问者,并对e fly插入排序。在我的机器上,在一个包含2300个文件的目录(一个映像目录)上,性能大约提高了4倍

InsertionSortFilter的代码:

    class SortFilter implements FileFilter {

        final LinkedList<File> topFiles;
        private final int n;

        public SortFilter(int n) {
            this.n = n;
            topFiles = new LinkedList<File>();
        }

        public boolean accept(File newF) {
            long newT = newF.lastModified();

            if(topFiles.size()==0){
                //list is empty, so we can add this one for sure
                topFiles.add(newF);
            } else {
                int limit = topFiles.size()<n?topFiles.size():n;
                //find a place to insert
                int i=0;
                while(i<limit && newT <= topFiles.get(i).lastModified())
                    i++;

                if(i<limit){    //found
                    topFiles.add(i, newF);
                    if(topFiles.size()>n) //more than limit, so discard the last one. Maintain list at size n
                        topFiles.removeLast(); 
                }
            }
            return false;
        }

    }
类SortFilter实现FileFilter{
最终LinkedList topFiles;
私人终审法院;
公共分拣过滤器(int n){
这个,n=n;
topFiles=newlinkedlist();
}
公共布尔接受(文件newF){
long newT=newF.lastModified();
如果(topFiles.size()==0){
//列表为空,因此我们可以确定添加此列表
topFiles.add(newF);
}否则{

int limit=topFiles.size()非常感谢您的回复。@user618111:不客气。如果您觉得这个答案有帮助,请选中左侧答案旁边的复选标记,将其标记为正确。导入java.io.File;导入java.util.array;导入java.util.Comparator;导入java.io.*;导入java.text.*;导入java.util.*;您好,我不知道如何在中插入您的代码我的,但如果保留第一个代码,我试图修改它以将最近的10个文件存储到一个文件夹中,但它会将每个文件都放入其中。下面是我修改的代码:
private File[] getTopFiles() {
    File dir = new File("C:\\icons_svr");
    SortFilter filter = new SortFilter(10);
    dir.listFiles(filter);      
    File[] topFiles = new File[10];
    return filter.topFiles.toArray(topFiles);
}
    class SortFilter implements FileFilter {

        final LinkedList<File> topFiles;
        private final int n;

        public SortFilter(int n) {
            this.n = n;
            topFiles = new LinkedList<File>();
        }

        public boolean accept(File newF) {
            long newT = newF.lastModified();

            if(topFiles.size()==0){
                //list is empty, so we can add this one for sure
                topFiles.add(newF);
            } else {
                int limit = topFiles.size()<n?topFiles.size():n;
                //find a place to insert
                int i=0;
                while(i<limit && newT <= topFiles.get(i).lastModified())
                    i++;

                if(i<limit){    //found
                    topFiles.add(i, newF);
                    if(topFiles.size()>n) //more than limit, so discard the last one. Maintain list at size n
                        topFiles.removeLast(); 
                }
            }
            return false;
        }

    }