알파벳 순서로 File.listFiles하는 방법?


95

다음과 같은 코드가 있습니다.

class ListPageXMLFiles implements FileFilter {

        @Override
        public boolean accept(File pathname) {
                DebugLog.i("ListPageXMLFiles", "pathname is " + pathname);

                String regex = ".*page_\\d{2}\\.xml";
                if(pathname.getAbsolutePath().matches(regex)) {
                        return true;
                }
                return false;
        }
}

public void loadPageTrees(String xml_dir_path) {
        ListPageXMLFiles filter_xml_files = new ListPageXMLFiles();
        File XMLDirectory = new File(xml_dir_path);
        for(File _xml_file : XMLDirectory.listFiles(filter_xml_files)) {
                loadPageTree(_xml_file);
        }
}

FileFilter잘 작동하지만 listFiles()파일을 알파벳 역순으로 나열하는 것 같습니다. listFile()파일을 알파벳순으로 나열하는 빠른 방법이 있습니까?


1
정규식을 사용하는 .endsWith(".xml")대신 대신 사용하십시오.
Fred

답변:


221

listFiles방법은, 또는 필터없이 임의의 순서를 보장하지 않습니다.

그러나를 사용하여 정렬 할 수있는 배열을 반환합니다 Arrays.sort().

File[] files = XMLDirectory.listFiles(filter_xml_files);
Arrays.sort(files);
for(File _xml_file : files) {
    ...
}

이것은 File기본적으로 경로 이름을 사전 순으로 정렬하는 비교 가능한 클래스 이기 때문에 작동합니다 . 다르게 정렬하려면 자신 만의 비교기를 정의 할 수 있습니다.

Streams 사용을 선호하는 경우 :

보다 현대적인 접근 방식은 다음과 같습니다. 주어진 디렉토리에있는 모든 파일의 이름을 알파벳순으로 인쇄하려면 다음을 수행하십시오.

Files.list(Paths.get(dirName)).sorted().forEach(System.out::println)

System.out::println파일 이름으로 원하는대로 바꾸십시오. 다음으로 끝나는 파일 이름 만 원하는 경우 "xml":

Files.list(Paths.get(dirName))
    .filter(s -> s.toString().endsWith(".xml"))
    .sorted()
    .forEach(System.out::println)

다시 말하지만 원하는 처리 작업으로 인쇄를 교체하십시오.


이것은 아름다운 코드 줄이지 만 Arrays.sort ()는 Iterable 대신 void를 반환하는 것 같습니다. 조금 찌르겠습니다.
Thunder Rabbit

3
@Thunder Rabbit, 내 사과 !! 죄송합니다. 당신 말이 맞습니다. 나는 그것을 시험 했어야했다. 나는 내 대답을 편집했다.
Ray Toal 2011-08-26

Windows에서 잘 작동하는 것 같지만 Ubuntu 폴더에서는 대문자가 나머지 폴더보다 먼저 나타납니다.
jmhostalet 2014 년

5
그것이 제가 기대하는 방식입니다. 유니 코드에서 대문자는 소문자 앞에옵니다. Unix에는 대소 문자를 구분하는 파일 이름이 있으므로 대문자가 먼저옵니다. Windows에서 대소 문자를 구분하지 않는 파일 이름을 사용하는 경우 대문자와 소문자 이름이 함께 혼합됩니다. 이것은 완전히 예상 한 것입니다. Unix에서 Windows 방식을 원하면 sort.
Ray Toal 2014 년

2

이전 답변이 가장 좋은 방법이라고 생각합니다. 또 다른 간단한 방법이 있습니다. 정렬 된 결과를 인쇄합니다.

 String path="/tmp";
 String[] dirListing = null;
 File dir = new File(path);
 dirListing = dir.list();
 Arrays.sort(dirListing);
 System.out.println(Arrays.deepToString(dirListing));

이것이 정답이 아니라고 생각하는 이유를 설명해 주시겠습니까? 따라서 그에 따라 수정할 수 있습니다.
grepit 2013

1
-1 파일 배열을 문자열 배열로 변환 한 다음 허용되는 대답처럼 파일 배열을 정렬하는 것보다 정렬하는 이점을 정말로 이해하지 못합니다.
zelanix

@zelanix 피드백을 제공해 주셔서 감사합니다. 나는 모든 답을 가지고 있지 않으며 때때로 질문에 답하면서 실수를합니다. 답변을 업데이트했습니다. 검토하고 이것이 더 나은 해결책인지 확인해 주시겠습니까? 투표를 재고 해 주시면 감사하겠습니다. 미리 감사드립니다.
grepit

1
좋아, 이제 결과를 인쇄하고 싶은 경우 왜 더 간단한 지 정당화하여 내 반대표를 제거하겠습니다.
zelanix

3
@ CPU100 나는 listFiles () 대신 list ()를 사용하면 상위 디렉토리 경로없이 파일 이름 만 갖는 이점이 있으므로 문자열이 짧아지고 정렬 / 비교하는 CPU 시간이 줄어든다고 생각합니다.
Diljeet

1

Java 8에서

Arrays.sort(files, (a, b) -> a.getName().compareTo(b.getName()));

역순으로:

Arrays.sort(files, (a, b) -> -a.getName().compareTo(b.getName()));

2
이 코드도 사용할 수 있습니다.Arrays.sort(fList, Comparator.comparing(File::getName));
plaidshirt

이것에 조심하십시오. 이 코드는 비 결정적이므로 그대로 사용하면 안됩니다.
Tony Schwartz

0

이것은 내 코드입니다.

        try {
            String folderPath = "../" + filePath.trim() + "/";
            logger.info("Path: " + folderPath);
            File folder = new File(folderPath);
            File[] listOfFiles = folder.listFiles();
            int length = listOfFiles.length;
            logger.info("So luong files: " + length);
            ArrayList<CdrFileBO> lstFile = new ArrayList< CdrFileBO>();

            if (listOfFiles != null && length > 0) {
                int count = 0;
                for (int i = 0; i < length; i++) {
                    if (listOfFiles[i].isFile()) {
                        lstFile.add(new CdrFileBO(listOfFiles[i]));
                    }
                }
                Collections.sort(lstFile);
                for (CdrFileBO bo : lstFile) {
                    //String newName = START_NAME + "_" + getSeq(SEQ_START) + "_" + DateSTR + ".s";
                    String newName = START_NAME + DateSTR + getSeq(SEQ_START) + ".DAT";
                    SEQ_START = SEQ_START + 1;
                    bo.getFile().renameTo(new File(folderPath + newName));
                    logger.info("newName: " + newName);
                    logger.info("Next file: " + getSeq(SEQ_START));
                }

            }
        } catch (Exception ex) {
            logger.error(ex);
            ex.printStackTrace();
        }

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.