ক্লাসপথ ডিরেক্টরি থেকে সংস্থানগুলির একটি তালিকা পান


247

আমি কোনও প্রদত্ত ক্লাসপথ ডিরেক্টরি থেকে সমস্ত সংস্থার নামের তালিকা পেতে একটি উপায় খুঁজছি List<String> getResourceNames (String directoryName)

উদাহরণস্বরূপ, একটি ক্লাসপাথ ডিরেক্টরির দেওয়া x/y/zফাইল ধারণকারী a.html, b.html, c.htmlএবং একটি সাব d, getResourceNames("x/y/z")একটি ফিরতি উচিত List<String>নিম্নলিখিত পংক্তি ধারণকারী: ['a.html', 'b.html', 'c.html', 'd']

ফাইল সিস্টেম এবং জারের সংস্থানগুলির জন্য এটি উভয়ই কাজ করা উচিত।

আমি জানি যে আমি Fileএস, JarFileএস এবং URLএস সহ একটি দ্রুত স্নিপেট লিখতে পারি, তবে আমি চাকাটি পুনরায় উদ্ভাবন করতে চাই না। আমার প্রশ্নটি হ'ল বিদ্যমান সার্বজনীনভাবে উপলব্ধ গ্রন্থাগারগুলি দেওয়া, বাস্তবায়নের দ্রুততম উপায় getResourceNamesকী? স্প্রিং এবং অ্যাপাচি কমন্স স্ট্যাক উভয়ই সম্ভাব্য।


1
সম্পর্কিত উত্তর: স্ট্যাকওভারফ্লো.com
সিএফএক্স

এই প্রকল্পটি দেখুন, রিসোর্স ফোল্ডার স্ক্যানিং সমাধান করে: github.com/fraballi/resources-folder-scanner
ফেলিক্স

উত্তর:


165

কাস্টম স্ক্যানার

আপনার নিজের স্ক্যানার প্রয়োগ করুন। উদাহরণ স্বরূপ:

private List<String> getResourceFiles(String path) throws IOException {
    List<String> filenames = new ArrayList<>();

    try (
            InputStream in = getResourceAsStream(path);
            BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
        String resource;

        while ((resource = br.readLine()) != null) {
            filenames.add(resource);
        }
    }

    return filenames;
}

private InputStream getResourceAsStream(String resource) {
    final InputStream in
            = getContextClassLoader().getResourceAsStream(resource);

    return in == null ? getClass().getResourceAsStream(resource) : in;
}

private ClassLoader getContextClassLoader() {
    return Thread.currentThread().getContextClassLoader();
}

স্প্রিং ফ্রেমওয়ার্ক

PathMatchingResourcePatternResolverস্প্রিং ফ্রেমওয়ার্ক থেকে ব্যবহার করুন ।

রনমো প্রতিচ্ছবি

অন্যান্য কৌশলগুলি বিশাল ক্লাসস্প্যাথ মানগুলির জন্য রানটাইমে ধীর হতে পারে। একটি দ্রুত সমাধান রনমো'র প্রতিচ্ছবি এপিআই ব্যবহার করা হয় যা সংকলন সময়ে অনুসন্ধানকে পূর্ববর্তী করে তোলে ।


12
যদি প্রতিচ্ছবিগুলি ব্যবহার করে, আপনার যা প্রয়োজন তা আসলে:new Reflections("my.package", new ResourcesScanner()).getResources(pattern)
জ্যাপ করুন

27
জার ফাইল থেকে কার্যকর হলে প্রথম সমাধানটি কাজ করে? আমার জন্য - এটা না। আমি এইভাবে ফাইল পড়তে পারি, তবে ডিরেক্টরিটি পড়তে পারি না।
ভ্যালেন্টিনা চুমাক

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

7
ফাইল স্ট্রিম ছাড়া ডিরেক্টরি নেই বলেই আপনি এই জাতীয় ডিরেক্টরি পড়তে পারবেন না। এই উত্তর অর্ধেক ভুল।
থমাস ডেকাউক্স

4
প্রথম পদ্ধতিটি কাজ করতে দেখা যায় না - কমপক্ষে যখন পরিবেশের পরিবেশ থেকে চালিত হয়, সংস্থানগুলি উত্সাহিত করার আগে। getResourceAsStream()ডিরেক্টরিতে কোনও আপেক্ষিক পাথের সাথে কল করার ফলে একটি ফাইলআইনপুটস্ট্রিম (ফাইল) বাড়ে, যা ফাইল ডিরেক্টরি হিসাবে যদি ফাইলনটফাউন্ডএক্সসেপশন নিক্ষেপিত হয়।
অ্যান্ডি টমাস

52

এখানে কোড
উত্স : forums.devx.com/showthread.php?t=153784

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;

/**
 * list resources available from the classpath @ *
 */
public class ResourceList{

    /**
     * for all elements of java.class.path get a Collection of resources Pattern
     * pattern = Pattern.compile(".*"); gets all resources
     * 
     * @param pattern
     *            the pattern to match
     * @return the resources in the order they are found
     */
    public static Collection<String> getResources(
        final Pattern pattern){
        final ArrayList<String> retval = new ArrayList<String>();
        final String classPath = System.getProperty("java.class.path", ".");
        final String[] classPathElements = classPath.split(System.getProperty("path.separator"));
        for(final String element : classPathElements){
            retval.addAll(getResources(element, pattern));
        }
        return retval;
    }

    private static Collection<String> getResources(
        final String element,
        final Pattern pattern){
        final ArrayList<String> retval = new ArrayList<String>();
        final File file = new File(element);
        if(file.isDirectory()){
            retval.addAll(getResourcesFromDirectory(file, pattern));
        } else{
            retval.addAll(getResourcesFromJarFile(file, pattern));
        }
        return retval;
    }

    private static Collection<String> getResourcesFromJarFile(
        final File file,
        final Pattern pattern){
        final ArrayList<String> retval = new ArrayList<String>();
        ZipFile zf;
        try{
            zf = new ZipFile(file);
        } catch(final ZipException e){
            throw new Error(e);
        } catch(final IOException e){
            throw new Error(e);
        }
        final Enumeration e = zf.entries();
        while(e.hasMoreElements()){
            final ZipEntry ze = (ZipEntry) e.nextElement();
            final String fileName = ze.getName();
            final boolean accept = pattern.matcher(fileName).matches();
            if(accept){
                retval.add(fileName);
            }
        }
        try{
            zf.close();
        } catch(final IOException e1){
            throw new Error(e1);
        }
        return retval;
    }

    private static Collection<String> getResourcesFromDirectory(
        final File directory,
        final Pattern pattern){
        final ArrayList<String> retval = new ArrayList<String>();
        final File[] fileList = directory.listFiles();
        for(final File file : fileList){
            if(file.isDirectory()){
                retval.addAll(getResourcesFromDirectory(file, pattern));
            } else{
                try{
                    final String fileName = file.getCanonicalPath();
                    final boolean accept = pattern.matcher(fileName).matches();
                    if(accept){
                        retval.add(fileName);
                    }
                } catch(final IOException e){
                    throw new Error(e);
                }
            }
        }
        return retval;
    }

    /**
     * list the resources that match args[0]
     * 
     * @param args
     *            args[0] is the pattern to match, or list all resources if
     *            there are no args
     */
    public static void main(final String[] args){
        Pattern pattern;
        if(args.length < 1){
            pattern = Pattern.compile(".*");
        } else{
            pattern = Pattern.compile(args[0]);
        }
        final Collection<String> list = ResourceList.getResources(pattern);
        for(final String name : list){
            System.out.println(name);
        }
    }
}  

আপনি যদি স্প্রিং ব্যবহার করছেন তবে প্যাথম্যাচিংআরসোর্সপ্যাটার্ন রিসোলভারটি দেখুন


3
প্রশ্নকর্তা স্ট্যান্ডার্ড জাভা ক্লাস ব্যবহার করে কীভাবে এটি প্রয়োগ করতে হয় তা জানেন তবে তিনি কীভাবে বিদ্যমান (স্প্রিং, অ্যাপাচি কমন্স) লাইব্রেরি ব্যবহার করতে পারবেন তা জানতে চান।
জেরোইন রোজনবার্গ

@ জিরোইন রোজেনবার্গ আরও একটি উপায় দেওয়া হয়েছে যা অবশেষে নির্বাচিত হয়েছে :)
জিগার জোশী

7
আপনি বসন্তটি ব্যবহার করেন না এমন ক্ষেত্রে আমি এই সমাধানটি দরকারী বলে মনে করি - কেবল এই বৈশিষ্ট্যটির কারণে বসন্তের উপর নির্ভরতা যুক্ত করা হাস্যকর। তাই আপনাকে ধন্যবাদ! "মলিন" কিন্তু দরকারী :) দ্রষ্টব্য একটি ব্যবহার করতে চাইতে পারেন File.pathSeparatorপরিবর্তে হার্ড কোডেড :মধ্যে getResourcesপদ্ধতি।
তৈমুর

5
কোড উদাহরণটি সিস্টেম নির্ভর, পরিবর্তে এটি ব্যবহার করুন: final String[] classPathElements = classPath.split(System.pathSeparator);
ডিসকোমাইল

1
ক্যাভেট: java.class.path সিস্টেমের সম্পত্তিটিতে আপনি যে প্রকৃত ক্লাসপাথটি চালাচ্ছেন তা নাও থাকতে পারে। আপনি বিকল্পভাবে ক্লাস লোডারটি দেখতে এবং এটি কোন URL থেকে ক্লাসগুলি লোড করছে তা জিজ্ঞাসাবাদ করতে পারে। অবশ্যই অন্য সাবধানতাটি হ'ল আপনি যদি সিকিউরিটি ম্যানেজারের অধীনে এটি করছেন তবে জিপফিল কনস্ট্রাক্টর আপনার ফাইলটিতে অ্যাক্সেস প্রত্যাখ্যান করতে পারেন, তাই আপনার এটি ধরা উচিত।
ট্রেজকাজ

24

প্রতিচ্ছবি ব্যবহার করে

ক্লাসপথে সবকিছু পান:

Reflections reflections = new Reflections(null, new ResourcesScanner());
Set<String> resourceList = reflections.getResources(x -> true);

অন্য উদাহরণ - কিছু.প্যাকেজ থেকে এক্সটেনশন .csv সহ সমস্ত ফাইল পান :

Reflections reflections = new Reflections("some.package", new ResourcesScanner());
Set<String> fileNames = reflections.getResources(Pattern.compile(".*\\.csv"));

গুগল নির্ভরতা আমদানি না করে একই অর্জনের কোনও উপায় আছে কি? আমি কেবল এই কাজটি সম্পাদন করতে এই নির্ভরতা থাকা এড়াতে চাই।
এনরিকো গিউরিন

1
প্রতিচ্ছবি একটি গুগল গ্রন্থাগার নয়।
লুক হাচিসন

আগেও ছিল হয়তো। আমার উত্তর 2015 থেকে এবং আমি ফ্রেজ "গুগল ভাবনা" 2015. আগে আমি দেখতে কোড একটু ঘুরে সরানো হয়েছে এবং code.google.com থেকে সরানো হয়েছে ব্যবহার লাইব্রেরিতে কিছু রেফারেন্স খুঁজে পাইনি এখানে GitHub থেকে এখানে
এখানে ক্লিক করুন ডু Toit

@ এনএনএসডুয়েট সম্ভবত গুগল কোডে কোড হোস্ট করার একটি নিদর্শন ছিল (কোনও অস্বাভাবিক ভুল নয়), গুগলের লেখকতার দাবি নয়।
ম্যাট বি

17

আপনি যদি অ্যাপাচি কমোনস ব্যবহার করেন তবে আপনি ফাইল সিস্টেমের জন্য ব্যবহার করতে পারেন (optionচ্ছিকভাবে এক্সটেনশন ফিল্টার সহ):

Collection<File> files = FileUtils.listFiles(new File("directory/"), null, false);

এবং সংস্থানসমূহ / শ্রেণিপথের জন্য:

List<String> files = IOUtils.readLines(MyClass.class.getClassLoader().getResourceAsStream("directory/"), Charsets.UTF_8);

যদি আপনি না জানেন যে "ডিরেক্টয় / /" ফাইল সিস্টেমে আছে বা সংস্থানগুলিতে আপনি একটি যুক্ত করতে পারেন

if (new File("directory/").isDirectory())

অথবা

if (MyClass.class.getClassLoader().getResource("directory/") != null)

কল করার আগে এবং উভয় সংমিশ্রণে ব্যবহার করুন ...


23
ফাইলগুলি! = সংস্থানসমূহ
ডিজেলিন

3
অবশ্যই, সংস্থানগুলি সর্বদা ফাইল হতে পারে না তবে প্রশ্নটি ফাইল / ডিরেক্টরি থেকে উত্পন্ন উত্স সম্পর্কে ছিল। সুতরাং আপনি যদি আলাদা অবস্থান পরীক্ষা করতে চান তবে উদাহরণ কোডটি ব্যবহার করুন যেমন কিছু ডিফল্ট কনফিগারেশনের জন্য আপনার উত্সগুলিতে একটি config.xML রয়েছে এবং যদি এটি বিদ্যমান থাকে তবে তার পরিবর্তে কোনও বাহ্যিক config.xml লোড করা সম্ভব হবে ...
রব

2
এবং রিসোর্সগুলি ফাইল নয় কেন? রিসোর্সগুলি জিপ সংরক্ষণাগারে সংরক্ষণাগারভুক্ত ফাইল। এগুলি মেমরিতে লোড করা হয় এবং নির্দিষ্ট উপায়ে অ্যাক্সেস করা হয় তবে সেগুলি কেন ফাইল নয় তা আমি দেখতে পাচ্ছি না। রিসোর্সের কোনও এক্সপেল যা 'আর্কাইভের মধ্যে থাকা কোনও ফাইল' নয়?
মাইক

10
কাজ করছে না (নালপয়েন্টার এক্সসেপশন) যখন টার্গেট রিসোর্সটি এমন একটি ডিরেক্টরি যা কোনও জেআর ফাইলের অভ্যন্তরে থাকে (যেমন জেআর মূল অ্যাপ্লিকেশন এবং লক্ষ্য নির্দেশিকা থাকে)
কার্লিটোস ওয়ে

12

সুতরাং প্যাথম্যাচিংয়ের রিসোর্সপ্যাটার্ন রিসলভারের ক্ষেত্রে কোডে এটি প্রয়োজনীয়:

@Autowired
ResourcePatternResolver resourceResolver;

public void getResources() {
  resourceResolver.getResources("classpath:config/*.xml");
}

আপনার যদি প্রয়োজন সমস্ত classpath*:config/*.xml
শ্রেণিপথের

5

Spring frameworkএর PathMatchingResourcePatternResolverএই জিনিস জন্য সত্যিই দুর্দান্ত:

private Resource[] getXMLResources() throws IOException
{
    ClassLoader classLoader = MethodHandles.lookup().getClass().getClassLoader();
    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(classLoader);

    return resolver.getResources("classpath:x/y/z/*.xml");
}

মাভেন নির্ভরতা:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>LATEST</version>
</dependency>

5

রবের প্রতিক্রিয়াটির সংমিশ্রণ ব্যবহার করেছে।

final String resourceDir = "resourceDirectory/";
List<String> files = IOUtils.readLines(Thread.currentThread().getClass().getClassLoader().getResourceAsStream(resourceDir), Charsets.UTF_8);

for(String f : files){
  String data= IOUtils.toString(Thread.currentThread().getClass().getClassLoader().getResourceAsStream(resourceDir + f));
  ....process data
}

কীভাবে সমস্ত সংস্থান লাভ করবেন: অর্থাত্ একটি /' or ./
দিয়েই শুরু করুন `

3

বসন্তের সাথে এটি সহজ। এটি কোনও ফাইল বা ফোল্ডার বা একাধিক ফাইল হোন, সম্ভাবনা রয়েছে, আপনি ইঞ্জেকশনের মাধ্যমে এটি করতে পারেন।

এই উদাহরণটি x/y/zফোল্ডারে অবস্থিত একাধিক ফাইলের ইনজেকশন প্রদর্শন করে ।

import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;

@Service
public class StackoverflowService {
    @Value("classpath:x/y/z/*")
    private Resource[] resources;

    public List<String> getResourceNames() {
        return Arrays.stream(resources)
                .map(Resource::getFilename)
                .collect(Collectors.toList());
    }
}

এটি ফাইল সিস্টেমের পাশাপাশি জেআর-তে সংস্থানগুলির জন্য কাজ করে।


2
আমি ফোল্ডারের নামগুলি / বুট-আইএনএফ / শ্রেণি / স্থির / গল্পের অধীনে পেতে চাই। আমি আপনার কোডটি @ ভ্যালু ("ক্লাসপাথ: স্ট্যাটিক / স্টোরিজ / *") দিয়ে চেষ্টা করে দেখি এবং জআআআআআআর চালানোর সময় এটি একটি খালি তালিকা দেয়। এটি ক্লাসপথে সংস্থানগুলির জন্য কাজ করে, তবে যখন তারা জেআরে থাকে না not
পিএস

@ ভ্যালু ("শ্রেণিপথ: x / y / z / *") ব্যক্তিগত সম্পদ [] সংস্থানসমূহ; কৌতুকটি আমাকে করেছে তার জন্য অনুসন্ধানের সময় আছে! ধন্যবাদ!
রুডলফ

3

এটি কাজ করা উচিত (যদি বসন্ত কোনও বিকল্প না হয়):

public static List<String> getFilenamesForDirnameFromCP(String directoryName) throws URISyntaxException, UnsupportedEncodingException, IOException {
    List<String> filenames = new ArrayList<>();

    URL url = Thread.currentThread().getContextClassLoader().getResource(directoryName);
    if (url != null) {
        if (url.getProtocol().equals("file")) {
            File file = Paths.get(url.toURI()).toFile();
            if (file != null) {
                File[] files = file.listFiles();
                if (files != null) {
                    for (File filename : files) {
                        filenames.add(filename.toString());
                    }
                }
            }
        } else if (url.getProtocol().equals("jar")) {
            String dirname = directoryName + "/";
            String path = url.getPath();
            String jarPath = path.substring(5, path.indexOf("!"));
            try (JarFile jar = new JarFile(URLDecoder.decode(jarPath, StandardCharsets.UTF_8.name()))) {
                Enumeration<JarEntry> entries = jar.entries();
                while (entries.hasMoreElements()) {
                    JarEntry entry = entries.nextElement();
                    String name = entry.getName();
                    if (name.startsWith(dirname) && !dirname.equals(name)) {
                        URL resource = Thread.currentThread().getContextClassLoader().getResource(name);
                        filenames.add(resource.toString());
                    }
                }
            }
        }
    }
    return filenames;
}

এটি সম্প্রতি একটি ডাউনভোট পেয়েছে - যদি আপনি এটির সাথে কোনও সমস্যা খুঁজে পান তবে দয়া করে ভাগ করুন, ধন্যবাদ!
fl0w

1
আপনাকে ধন্যবাদ @ আরনোউনক্রিগ - দয়া করে আপনার আপডেট সমাধানটি ভাগ করুন
fl0w

3

আমার উপায়, কোনও স্প্রিং নয়, ইউনিট পরীক্ষার সময় ব্যবহৃত:

URI uri = TestClass.class.getResource("/resources").toURI();
Path myPath = Paths.get(uri);
Stream<Path> walk = Files.walk(myPath, 1);
for (Iterator<Path> it = walk.iterator(); it.hasNext(); ) {
    Path filename = it.next();   
    System.out.println(filename);
}

কাজ করে না, যখন আপনি একটি জার চালান: java.nio.file.FileSystemNotFoundException at Path..get (uri)
ত্রুটি 1009

1

শ্রেণিপথের সমস্ত সংস্থান তালিকাভুক্ত করার জন্য সবচেয়ে শক্তিশালী প্রক্রিয়াটি বর্তমানে ক্লাসগ্রাফের সাথে এই প্যাটার্নটি ব্যবহার করা হয়েছে , কারণ এটি নতুন জেপিএমএস মডিউল সিস্টেম সহ শ্রেণিপথ স্পেসিফিকেশন পদ্ধতির বিস্তৃত সম্ভাব্য অ্যারে পরিচালনা করে । (আমি ক্লাসগ্রাফের লেখক))

List<String> resourceNames;
try (ScanResult scanResult = new ClassGraph().whitelistPaths("x/y/z").scan()) {
    resourceNames = scanResult.getAllResources().getNames();
}

0

আমি মনে করি এটি অর্জনের জন্য আপনি [ জিপ ফাইল সিস্টেম সরবরাহকারী ] [1] কে কাজে লাগাতে পারেন। ব্যবহার করার সময়FileSystems.newFileSystemএটি সময় দেখে মনে হচ্ছে আপনি সেই জিপটিতে থাকা অবজেক্টগুলিকে একটি "নিয়মিত" ফাইল হিসাবে গণ্য করতে পারেন।

উপরের লিঙ্কযুক্ত ডকুমেন্টেশনে:

Java.util.Map অবজেক্টে জিপ ফাইল সিস্টেমের জন্য কনফিগারেশন বিকল্পগুলি উল্লেখ করুন FileSystems.newFileSystem । জিপ ফাইল সিস্টেমের জন্য সরবরাহকারী-নির্দিষ্ট কনফিগারেশন বৈশিষ্ট্য সম্পর্কে তথ্যের জন্য [জিপ ফাইল সিস্টেমের বৈশিষ্ট্য] [2] বিষয়টি দেখুন।

আপনার কাছে একবার জিপ ফাইল সিস্টেমের উদাহরণ পাওয়া গেলে, আপনি ফাইলগুলি অনুলিপি, চলন এবং নামকরণের পাশাপাশি ফাইলের বৈশিষ্ট্যগুলি সংশোধন করার মতো ক্রিয়াকলাপ সম্পাদনের জন্য [ java.nio.file.FileSystem] [3] এবং [ java.nio.file.Path] [4] ক্লাসের পদ্ধতিগুলি আহ্বান করতে পারেন ।

jdk.zipfs[জাভা ১১ রাজ্যে] মডিউলটির জন্য ডকুমেন্টেশন [5]:

জিপ ফাইল সিস্টেম সরবরাহকারী একটি জিপ বা জেআর ফাইলকে একটি ফাইল সিস্টেম হিসাবে বিবেচনা করে এবং ফাইলের বিষয়বস্তুগুলি পরিচালনা করার ক্ষমতা সরবরাহ করে। জিপ ফাইল সিস্টেম সরবরাহকারী FileSystems.newFileSystemইনস্টল করা থাকলে [ ] [6] দ্বারা তৈরি করা যেতে পারে ।

আপনার উদাহরণ সংস্থানগুলি ব্যবহার করে আমি এখানে একটি স্বতন্ত্র উদাহরণ। নোট করুন যে .zip.jar তবে ক্লাসপথ সংস্থান ব্যবহার করার জন্য আপনি নিজের কোডটি মানিয়ে নিতে পারেন:

সেটআপ

cd /tmp
mkdir -p x/y/z
touch x/y/z/{a,b,c}.html
echo 'hello world' > x/y/z/d
zip -r example.zip x

জাভা

import java.io.IOException;
import java.net.URI;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.util.Collections;
import java.util.stream.Collectors;

public class MkobitZipRead {

  public static void main(String[] args) throws IOException {
    final URI uri = URI.create("jar:file:/tmp/example.zip");
    try (
        final FileSystem zipfs = FileSystems.newFileSystem(uri, Collections.emptyMap());
    ) {
      Files.walk(zipfs.getPath("/")).forEach(path -> System.out.println("Files in zip:" + path));
      System.out.println("-----");
      final String manifest = Files.readAllLines(
          zipfs.getPath("x", "y", "z").resolve("d")
      ).stream().collect(Collectors.joining(System.lineSeparator()));
      System.out.println(manifest);
    }
  }

}

আউটপুট

Files in zip:/
Files in zip:/x/
Files in zip:/x/y/
Files in zip:/x/y/z/
Files in zip:/x/y/z/c.html
Files in zip:/x/y/z/b.html
Files in zip:/x/y/z/a.html
Files in zip:/x/y/z/d
-----
hello world

0

আমার সংস্থানগুলি রিসোর্স ফোল্ডারে রেখেছিল এবং উপরের উত্তরগুলি অনুসরণ করেছে যদিও কোনও উত্তরই আমার পক্ষে কাজ করেনি। কৌতুকটি কী করেছিল তা হ'ল:

@Value("file:*/**/resources/**/schema/*.json")
private Resource[] resources;

-5

উপরে @rob এর তথ্যের ভিত্তিতে, আমি প্রয়োগটি তৈরি করেছি যা আমি পাবলিক ডোমেনে প্রকাশ করছি:

private static List<String> getClasspathEntriesByPath(String path) throws IOException {
    InputStream is = Main.class.getClassLoader().getResourceAsStream(path);

    StringBuilder sb = new StringBuilder();
    while (is.available()>0) {
        byte[] buffer = new byte[1024];
        sb.append(new String(buffer, Charset.defaultCharset()));
    }

    return Arrays
            .asList(sb.toString().split("\n"))          // Convert StringBuilder to individual lines
            .stream()                                   // Stream the list
            .filter(line -> line.trim().length()>0)     // Filter out empty lines
            .collect(Collectors.toList());              // Collect remaining lines into a List again
}

যদিও আমি getResourcesAsStreamকোনও ডিরেক্টরিতে এটির মতো কাজ করার আশা করি না , এটি সত্যিই ঘটে এবং এটি ভালভাবে কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.