【问题标题】:How to get only 10 last modified files from directory using Java?如何使用 Java 从目录中仅获取 10 个最后修改的文件?
【发布时间】:2011-02-15 15:55:10
【问题描述】:

我是初学者,我发现了一个关于 java 中 lastmodified 文件的旧线程。 我想要的是从一个目录中只获取 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 ));
    }
}

我是初学者,如果在使用论坛时犯了一些错误,请见谅。

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

如果我保留第一个代码,我想将 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


    【解决方案1】:

    在您的代码示例中,更改:

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

    到:

    for(int i=0, length=Math.min(files.length, 10); i<length; i++) {
        System.out.println(files[i]);
    }
    

    【讨论】:

    • 非常感谢您的回复。
    • @user618111:不客气。如果您认为此答案有帮助,请勾选左侧答案旁边的复选标记,将其标记为正确。
    • 导入 java.io.File;导入 java.util.Arrays;导入 java.util.Comparator;导入java.io.*;导入java.text.*;导入 java.util.*;
    【解决方案2】:

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

    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;
            }
    
        }
    

    【讨论】:

    • 您好,我不知道如何在我的代码中插入您的代码,但如果保留第一个代码,我尝试修改它以将 10 个最近的文件存储到一个文件夹中,但它会将每个文件都放入其中。这是我修改的代码:
    【解决方案3】:

    操作系统在请求文件时不采用排序例程。因此,唯一的解决方案是获取所有文件(以确保您不会跳过您想要的文件之一)并自己对它们进行排序。

    文件系统通常会提供基于文件名抓取文件的例程,而 Java 通过带有 FileFilter 参数的 list(...) 公开这一点。

    在 Java 1.7 中(无论何时发布),都有新的面向文件的工具,可让您访问底层文件系统的抽象。有了这样的设施,可以想象创建一个文件访问者,但这对这种情况没有多大帮助,因为你不知道可以跳过哪些文件而不实际查看它的修改时间。这意味着即使有访问界面,您仍然需要检查每个文件的修改时间,以确保您没有错过您想要的十个文件之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多