簡體   English   中英

從資源包中讀取文件

[英]Reading a file from resource package

我在這里閱讀了許多文章,並做了很多Google搜索,但仍然無法從當前項目中的另一個Java包中讀取文件。

在我的一個類中,我有以下代碼,但是輸入流始終為null。 我曾嘗試使用上下文類加載器以及許多其他解決方案,但無濟於事。

InputStream is = this.getClass().getResourceAsStream( "opcodes.txt" );  
System.out.println(is);

另一個嘗試是:

InputStream is = ClassName.class.getResourcceAsStream("/resources/opcodes.txt");

也返回null。

對於為什么我無法在資源包中找到文件的任何幫助或解釋都將非常有用。

ps我正在使用eclipse如果這有所作為。

編輯:如果我使用OpenFileDialog查找文件,我能夠打開並讀取它,因此該文件確實存在並且沒有損壞。

可在以下位置找到getResourceAsStream()方法的文檔: http ://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResourceAsStream( java.lang.String)說:在委派之前,使用以下算法從給定資源名稱構造絕對資源名稱:

如果名稱以'/'('\\ u002f')開頭,則資源的絕對名稱是名稱中'/'之后的部分。 否則,絕對名稱的格式如下:modified_pa​​ckage_name / name,其中Modifyed_pa​​ckage_name是此對象的程序包名稱,用“ /”代替“。”。 ('\\ u002e')。

如果資源與調用方法的類所在的包位於同一包中,則您的第一次嘗試將成功。 您的第二次嘗試失敗,因為如文檔所述,您提供的文件名(“ /resources/opcodes.txt”)被替換為“ resources / opcodes.txt”。 我想這意味着該方法現在將在調用該方法的類所在的包內而不是在包外搜索包資源。 由於您沒有這樣的內部包,因此該方法返回null。

一種解決方法是在資源所在的包中定義一個類。 該類對於您所關心的可能是空的。 只需致電:

ClassWithinResourcePackage.class.getResourceAsStream("opcodes.txt");

從您當前從中調用該方法的類中,該方法便有效。

我也嘗試使用命令行中知道的“ ..”語法,但是它不起作用。 我認為文檔暗示該方法僅在同一包中查找文件。

資源文件通常放置在項目的src/main/resources/目錄中。 這些資源也與擴展名為.class的已編譯類文件一起打包在jar

我已經使用上面討論的目錄層次結構創建了一個示例maven項目。 項目結構

可以在程序中訪問資源文件sample-resource.properties ,如下所示:

    package temp;

    import java.io.InputStream;
    import java.util.Scanner;

    public class ResourceTest {
        public static void main(String[] args) {
            InputStream inputStream = ResourceTest.class.getResourceAsStream("/sample-resource.properties");
            Scanner scanner = new Scanner(inputStream);
            while (scanner.hasNext()) {
                System.out.println(scanner.nextLine());
            }
        }
    }

這將讀取並打印資源文件的內容: 在此處輸入圖片說明

暫無
暫無

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

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