Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以数字顺序获取文件夹| JAVA中的文件名_Java_File - Fatal编程技术网

如何以数字顺序获取文件夹| JAVA中的文件名

如何以数字顺序获取文件夹| JAVA中的文件名,java,file,Java,File,您好,我正在尝试以数字顺序获取文件夹中存在的所有文件 首先,我检查文件夹(主文件夹)中包含的子文件夹。之后,我将获得每个子文件夹中存在的文件名。 我写了一个代码来完成这项工作,但是当我打印(子文件夹的文件名)时,我没有按照正确的顺序得到它们。(数字) 例如,我的主文件夹名为'test',其中有3个子文件夹名为Sub1、Sub2、Sub3 FOLDER Test *contains* [ FOLDER SUB1 || FOLDER SUB2 || FOLDER SUB3 ] 每个子文

您好,我正在尝试以数字顺序获取文件夹中存在的所有文件

首先,我检查文件夹(主文件夹)中包含的子文件夹。之后,我将获得每个子文件夹中存在的文件名。
我写了一个代码来完成这项工作,但是当我打印(子文件夹的文件名)时,我没有按照正确的顺序得到它们。(数字)

例如,我的主文件夹名为'test',其中有3个子文件夹名为Sub1、Sub2、Sub3

 FOLDER Test *contains* [  FOLDER SUB1   || FOLDER SUB2  ||  FOLDER SUB3 ]
每个子文件夹都有文件名(1.txt、2.txt、…、15.txt、16.txt、…、22.txt、…)等)

此代码执行此任务。。。但是

import java.io.File;
import java.io.FileFilter;
public class Main {
public static void main(String[] args) {
    File file = new File("C:\\test");
    File[] files = file.listFiles(new FileFilter() {
        public boolean accept(File f) {       
            String name=f.getName(); //read every subfodler name
            System.out.println(name);        
            File folder = new File("C:\\test\\"+name); //for each subfolder
            File[] listOfFiles = folder.listFiles();  
            for (int i = 0; i < listOfFiles.length; i++) {
                if (listOfFiles[i].isFile()) {
                    System.out.println("File " + listOfFiles[i].getName());
                    //print the names of files that included
                } else if (listOfFiles[i].isDirectory()) {
                    System.out.println("Directory " + listOfFiles[i].getName());      
                }    
            } 
            return f.isDirectory();
        }});   
    }   
}
我如何以数字顺序获取文件名,以便得到如下输出:

 Folder1               
 File 1.txt
 File 2.txt
 File 3.txt
 File 4.txt
 File 5.txt
 File 6.txt
 File 7.txt
 File 8.txt
 File 9.txt
 File 10.txt
 File 11.txt
 File 12.txt
 File 13.txt
 File 14.txt

一旦将文件放入列表或数组中,就可以使用Collections.sort()或Arrays.sort()对其进行排序,并且像这样的自定义比较器java.io.File是一个过时的类。多年前,它被中的类和其他类(如文件和路径)所取代

您不应使用筛选器执行筛选以外的任何操作。是的,它可以工作,但你依赖的是副作用,而不是预期的功能

要比较文件名的数字部分,您需要编写自己的:

Path root=Path.get(“C:\\test”);
Pattern numericFileNamePattern=Pattern.compile(“.[^0-9]([0-9]+)\\.[^.]+”;
比较器字节数=(p1,p2)->{
字符串名称1=p1.getFileName().toString();
字符串名称2=p2.getFileName().toString();
Matcher Matcher=numericFileNamePattern.Matcher(name1);
if(matcher.matches()){
String digits1=matcher.group(1);
字符串withoutDigits1=matcher.replaceFirst(“”);
匹配器重置(名称2);
if(matcher.matches()){
String digits2=matcher.group(1);
String withoutDigits2=matcher.replaceFirst(“”);
if(不带数字1.等于(不带数字2)){
long num1=long.parseLong(数字1);
long num2=long.parseLong(数字2);
返回Long.compare(num1,num2);
}
}
}
返回p1.compareTo(p2);
};
try(DirectoryStream dir=Files.newDirectoryStream(root)){
for(路径子项:dir){
if(Files.isDirectory(子目录)){
try(流列表=Files.list(子)){
Path[]files=listing.filter(f->files.isRegularFile(f))
.sorted(按编号).toArray(路径[]:::新建);
用于(路径文件:文件){
System.out.println(文件);
}
}
}
}
}

它们已按升序排列。您需要的是数字顺序,如果您正确缩进代码,将有更多的人查看您的代码。现在,它很难阅读。此外,您还滥用了FileFilter;它的工作只是过滤文件,不应该用作“每个文件”的快捷方式。这给出了解决方案的提示,但不是一个完整的答案。而且,不需要ArrayList;只要使用,这是一个提示。oops认为他将文件存储在一个列表中并不是过时的,只是因为Path可以做得更多。它仍然没有被弃用,并且是JDK的一部分。@Robert像Vector、Hashtable和Enumeration一样,它被太多其他类所使用,无法弃用。除了与其他API的互操作之外,该文件类没有其他价值。
 Folder1               
 File 1.txt
 File 2.txt
 File 3.txt
 File 4.txt
 File 5.txt
 File 6.txt
 File 7.txt
 File 8.txt
 File 9.txt
 File 10.txt
 File 11.txt
 File 12.txt
 File 13.txt
 File 14.txt
Path root = Paths.get("C:\\test");

Pattern numericFileNamePattern = Pattern.compile(".*[^0-9]([0-9]+)\\.[^.]+");

Comparator<Path> byNumber = (p1, p2) -> {

    String name1 = p1.getFileName().toString();
    String name2 = p2.getFileName().toString();

    Matcher matcher = numericFileNamePattern.matcher(name1);
    if (matcher.matches()) {

        String digits1 = matcher.group(1);
        String withoutDigits1 = matcher.replaceFirst("");

        matcher.reset(name2);
        if (matcher.matches()) {

            String digits2 = matcher.group(1);
            String withoutDigits2 = matcher.replaceFirst("");

            if (withoutDigits1.equals(withoutDigits2)) {
                long num1 = Long.parseLong(digits1);
                long num2 = Long.parseLong(digits2);

                return Long.compare(num1, num2);
            }
        }
    }

    return p1.compareTo(p2);
};

try (DirectoryStream<Path> dir = Files.newDirectoryStream(root)) {
    for (Path child : dir) {
        if (Files.isDirectory(child)) {

            try (Stream<Path> listing = Files.list(child)) {
                Path[] files = listing.filter(f -> Files.isRegularFile(f))
                    .sorted(byNumber).toArray(Path[]::new);

                for (Path file : files) {
                    System.out.println(file);
                }
            }

        }
    }
}