簡體   English   中英

從源代碼動態訪問src / main / resources /

[英]Access src/main/resources/ dynamically from source code

我的文件位於projectRoot/src/main/resources/levels/

在此處輸入圖片說明

如果我調用Utils.getFileNamesInDirectory("src/main/resources/levels") ,它將起作用。
但是當打包項目時,將levels目錄放置在.jar root目錄下。
如何在靜態課程中使它動態化? src/main/resources/
因此該代碼將在Eclipse中作為獨立的jar運行。

列出目錄中文件的代碼

public class Utils {
    public static List<String> getFileNamesInDirectory(String directory){

        List<String> results = new ArrayList<String>();

        File[] files = new File(directory).listFiles(new FilenameFilter() {
            public boolean accept(File dir, String filename) {
                return filename.endsWith(".json");
            }
        });

        for (File file : files) {
            if (file.isFile()) {
                results.add(file.getName());
            }
        }

        Collections.sort(results);

        return results;
    }
}

更新

我已經開始使用getResourceAsStream (因為getResource導致IllegalArgumentException: URI is not hierarchical ),並且能夠在Eclipse的目錄中列出文件。

public static List<String> getFileNamesInDirectory(String directory){

        List<String> results = new ArrayList<String>();
        InputStream in = Utils.class.getResourceAsStream("/" + directory);
        BufferedReader rdr = new BufferedReader(new InputStreamReader(in));
        String line;

        try {

            while ((line = rdr.readLine()) != null) {
                System.out.println("file: " + line);
                results.add(new File(line).getName());
            }

            rdr.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        Collections.sort(results);

        return results;
    }

但是當我將其作為獨立.jar運行時,在此行上出現以下錯誤: while ((line = rdr.readLine()) != null) {
為什么它在Eclipse之外不起作用?

Exception in thread "main" java.lang.NullPointerException
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:322)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:364)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:210)
    at java.io.InputStreamReader.read(InputStreamReader.java:205)
    at java.io.BufferedReader.fill(BufferedReader.java:165)
    at java.io.BufferedReader.readLine(BufferedReader.java:328)
    at java.io.BufferedReader.readLine(BufferedReader.java:393)
    at com.app.tools.Utils.getFileNamesInDirectory(Utils.java:31)

您的代碼在Eclipse中工作的原因是Eclipse從項目目錄啟動了java進程,我們可以假定在

Utils.getFileNamesInDirectory("src/main/resources/levels")

相對於當前工作目錄(項目目錄)。 由於文件系統位置<project-directory>/src/main/resources/levels存在,因此可以找到它並將其返回給您。

src/main/resources是一種Maven約定,用於保存在編譯/構建/部署項目時最終會在類路徑中結束的資源。 要從類路徑檢索資源,請使用Class#getResource(String)ClassLoader#getResource(String)和/或ClassLoader#getSystemResource(String)

現在, 盡管有一些方法可以在類路徑中列出資源,但是通常不應該這樣做。 如果您需要資源,則可以按名稱知道它,因此可以使用上面列出的方法之一來獲取它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM