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

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

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()파일을 알파벳순으로 나열하는 빠른 방법이 있습니까?



답변

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)

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


답변

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

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


답변

Java 8에서

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

역순으로:

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


답변

이것은 내 코드입니다.

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


답변