【问题标题】:Take input files same in the order as in directory以与目录中相同的顺序获取输入文件
【发布时间】:2016-04-01 15:12:52
【问题描述】:

我正在编写一个代码,其中有一堆文件必须作为目录的输入。

程序运行良好,但问题出现在文件的选取方式上。在我的目录中,当我进行排序时,显示的第一个文件是file5521.3,但在我的程序中,选择的第一个文件是file5521.100。这很令人困惑。

我也尝试过使用Arrays.sort(list, NameFileComparator.NAME_COMPARATOR),但它也给出了与之前相同的结果。

下面是我的代码。

void countFilesInDirectory(File directory, String inputPath) throws IOException {
    File[] list = directory.listFiles();
    Arrays.sort(list, NameFileComparator.NAME_COMPARATOR);
    for (int i = 0; i < list.length; i++) {
        System.out.println(list[i]);
    }
    tempPath = inputPath.substring(0, inputPath.lastIndexOf("\\") + 1) + "OP\\";
    File outPath = new File(tempPath);
    if (!outPath.exists()) {
        outPath.mkdir();
    }
    File temp = new File(tempPath + "temp.txt");
    FileOutputStream fos = new FileOutputStream(temp);

    if (!temp.exists()) {
        temp.createNewFile();
    }
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));

    for (int i = 0; i < list.length; i++) {
        System.out.println(list[i]);
        setStatusText(i);
        GenerateFiles(list[i].getAbsoluteFile().toString(), bw);
    }
    bw.write("</body>");
    bw.close();
    File newFile = new File(temp.getParent(), "Index.html");
    Files.move(temp.toPath(), newFile.toPath());
}

请告诉我该怎么做。

具有上次修改日期的工作解决方案

Arrays.sort(list, new Comparator<File>() {
            public int compare(File f1, File f2) {
                return Long.compare(f1.lastModified(), f2.lastModified());
            }
        });

Comparator 在上次修改日期上运行良好,但是当我使用以下代码尝试时。结果和之前一样。

Arrays.sort(list, new Comparator<File>() {

            @Override
            public int compare(File o1, File o2) {
                return o1.getName().compareTo(o2.getName());
            }

        });

在我的 Windows 资源管理器中,如下所示。我已经对文件名进行了排序。

我的控制台输出显示如下。

谢谢

【问题讨论】:

  • 为什么处理顺序很重要?如果是这样,那么文件名约定应该反映这一点,以避免目录和基于字符串的排序的差异,从而明确地相同。
  • 你的操作系统是什么,“在我的目录中当我进行排序时显示的第一个文件是”是什么意思?
  • 文件的顺序将取决于您用来查看它们的任何软件(例如 Windows 上的资源管理器)。您需要使用使用相同逻辑的比较器。
  • 嗨@RC。我的意思是,在我的 Windows 资源管理器中,当我单击标题栏时,名称会被排序。

标签: java


【解决方案1】:

If your OS is Windows XP or later, your files will be sorted using Numerical File Name Sorting.

由于您想在程序和文件资源管理器中匹配文件顺序,您可以:

  1. 按照链接中的步骤使用传统文字排序,这将改变文件资源管理器显示文件的方式。
  2. 创建一个自定义的Comparator,并将其传递给sort,它将根据数字的实际值进行排序(例如,3 会在 10 之前,因为 3

【讨论】:

  • 嗨 Chara,我试过了,但结果仍然没有变化 :(
【解决方案2】:

您可以使用 Apache Commons IO 使用许多预定义的 Comparators 对文件进行排序,甚至可以使用 CompositeFileComparator 组合这些文件

这是一个例子:

import org.apache.commons.io.comparator.*;

File dir = new File(".");
File[] files = dir.listFiles();
File[] filesSorted = DefaultFileComparator.DEFAULT_COMPARATOR.sort(files);
File[] filesReversed = DefaultFileComparator.DEFAULT_REVERSE.sort(files);

...和here is the list of available comparators

【讨论】:

  • 当我这样做时,它给了我一些错误说The method sort(File[]) is undefined for the type Comparator&lt;File&gt;
  • 嗨朋友,我已经用我尝试过的代码更新了我的问题。你能看看吗?
  • @Rakesh 你看到的是词法排序的结果。使用词法排序对字符串进行排序使得以下 A1 stackoverflow.com/questions/7270447/…
猜你喜欢
  • 1970-01-01
  • 2014-01-06
  • 2019-12-16
  • 2014-01-03
  • 2011-06-16
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多