কিভাবে ফাইলের তালিকাভুক্ত ফাইলগুলি বর্ণানুক্রমিক ক্রমে?


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()বর্ণমালা অনুসারে ফাইলগুলি তালিকাভুক্ত করার কিছু উপায় আছে কি ?


4
রিজেক্স ব্যবহার না করে .endsWith(".xml")পরিবর্তে ব্যবহার করুন।
ফ্রেড

উত্তর:


222

listFilesপদ্ধতি সহ বা একটি ফিল্টার ছাড়া কোনো আদেশ নিশ্চয়তা দেয় না।

এটি যাইহোক, একটি অ্যারে ফেরত দেয়, যা আপনি বাছাই করতে পারেন Arrays.sort()

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

এটি কাজ করে কারণ Fileতুলনামূলক শ্রেণি, যা ডিফল্টরূপে পাঠ্যনামকে ডিক্সোগ্রাফিকভাবে সাজায়। আপনি যদি এগুলিকে আলাদাভাবে বাছাই করতে চান তবে আপনি নিজের তুলককে সংজ্ঞায়িত করতে পারেন।

আপনি যদি স্ট্রিম ব্যবহার করা পছন্দ করেন:

আরও আধুনিক পদ্ধতির নিম্নলিখিতটি হল। বর্ণনামূলক ক্রমে প্রদত্ত ডিরেক্টরিতে সমস্ত ফাইলের নাম মুদ্রণ করতে, করুন:

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)

আবার আপনি যেটি প্রসেসিং অপারেশন চান তা মুদ্রণটিকে প্রতিস্থাপন করুন।


এটি কোডের একটি সুন্দর লাইন, তবে অ্যারেস.সোর্ট () প্রতীয়মান হওয়ার পরিবর্তে অকার্যকর বলে মনে হচ্ছে। আমি কিছুটা হাঁক দেব।
থান্ডার খরগোশ

4
@ থান্ডার খরগোশ, আমার ক্ষমা প্রার্থনা !! দুঃখিত, আপনি ঠিক বলেছেন। আমার এটা পরীক্ষা করা উচিত ছিল। আমি আমার উত্তর সম্পাদনা করেছি।
রায় তোয়াল

উইন্ডোজে এটি ঠিকঠাকভাবে কাজ করছে বলে মনে হচ্ছে তবে উবুন্টু ফোল্ডারে বাকীগুলির চেয়ে প্রথমে উপস্থিত হবে capital
jmhostalet

5
এটাই আমি কাজ করার আশা করব expect বড় বড় অক্ষর ইউনিকোডে ছোট ছোট অক্ষরের আগে আসে। ইউনিক্সগুলিতে কেস-সংবেদনশীল ফাইলের নাম রয়েছে তাই বড় বড় অক্ষরগুলি প্রথমে আসে। যদি আপনি উইন্ডোজে কেস-সংবেদনশীল ফাইলের নাম ব্যবহার করেন তবে মূলধন এবং ছোট হাতের নামগুলি একসাথে মিশ্রিত হবে। এটি সম্পূর্ণ প্রত্যাশার মতো। আপনি যদি ইউনিক্সে উইন্ডোজ পথ চান তবে একটি তুলনামূলক সরবরাহ করুন sort
রায় তোয়াল

2

আমি মনে করি পূর্ববর্তী উত্তরটি এখানে করার সর্বোত্তম উপায় হ'ল অন্য সহজ উপায়। কেবল বাছাই করা ফলাফল মুদ্রণ করতে।

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

আপনি দয়া করে কেন এটি সঠিক উত্তর নয় বলে মন্তব্য করেন? সুতরাং, আমি এটি অনুসারে এটি সংশোধন করতে পারেন।
গ্রেপিট

4
-1 আমি ফাইল অ্যারেটিকে স্ট্রিং অ্যারে রূপান্তর করার সুবিধাটি বুঝতে পারি না এবং তারপরে গ্রহণযোগ্য উত্তর হিসাবে কেবল ফাইল অ্যারে বাছাই করার পরিবর্তে বাছাই করা।
জেলানিক্স

প্রতিক্রিয়া দেওয়ার জন্য @ জেলানিক্স ধন্যবাদ thanks আমার কাছে সমস্ত উত্তর নেই এবং মাঝে মাঝে প্রশ্নের উত্তর দেওয়ার ক্ষেত্রে আমি ভুল করি। আমি উত্তরটি আপডেট করেছি, আপনি কি দয়া করে এটি পর্যালোচনা করে দেখুন এবং এটি আরও ভাল সমাধান কিনা তা দেখুন you আপনি যদি আপনার ভোটের বিষয়ে পুনর্বিবেচনা করতে পারেন তবে আমি এটির প্রশংসা করব। আগাম ধন্যবাদ.
গ্রেপিট

4
ঠিক আছে, এখন আপনি ন্যায্য প্রমাণ করুন কেন আপনি যদি ফলাফলগুলি প্রিন্ট করতে চান তবে আমি আমার ডাউনটোটটি সরিয়ে ফেলব।
জেলানিক্স

4
@ সিপিইউ 100 আমি বিশ্বাস করি যে তালিকাফায়ালের পরিবর্তে তালিকাটি () ব্যবহার করে প্যারেন্ট ডিরেক্টরি পাথ ছাড়াই কেবলমাত্র ফাইলের নাম থাকার সুবিধা দেয়, ফলস্বরূপ সংক্ষিপ্ত স্ট্রিং এবং কম সিপিইউ সময় বাছাই / তুলনা করার সময় হয়।
দিলজিৎ

1

জাভা 8 তে:

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

বিপরীত ক্রম:

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

4
আপনি এই Arrays.sort(fList, Comparator.comparing(File::getName));
কোডটিও

এটির সাথে সাবধানতা অবলম্বন করুন। এই কোডটি অ-নিরস্তাত্মক এবং এটি যেমন ব্যবহার করা উচিত নয়।
টনি শোয়ার্টজ

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.