簡體   English   中英

getResourceAsStream() - InputStream 使用相對路徑時為 null

[英]getResourceAsStream() - InputStream null when using relative path

我正在使用 Maven 並在嘗試使用以下方法讀取文件的靜態方法上運行 JUnit 測試:

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(filename);

然后使用new InputStreamReader(is)在另一個調用中用作讀取器。 這個作品時, filename只是一個文件名(如file.csv ),但是當filename是相對路徑(例如src/test/resources/file.csv ), is最終被null

我需要它來處理相對路徑,因為我正在通過 JUnit 運行一個測試套件來查找具有相對路徑的資源,而這些測試來自一個我無法控制更改的 JAR(即我實現了一個外觀實現類測試套件使用自己的資源調用自己的測試 - 它們不受我的控制)。

有沒有辦法讓這種方法與相對路徑一起工作,或者我可以通過其他方式在我的類路徑上找到測試正在尋找的資源?

在 maven 中運行測試, src/test/resources/ (默認情況下)“映射”到類(加載器)路徑的,所以在你的情況下/file.csvsrc/test/resources/file.csv的正確絕對路徑src/test/resources/file.csv

要成功加載"src/test/resources/file.csv" (資源)(完全是廢話),你應該有這個文件(物理上)可用: src/test/resources/src/test/resources/file.csv ,或分別為src/main/java (也將映射到 cp root)... /src/test/resources/file.csv

你的情況is最終被空,因為當進行資源查找,該resources目錄的切入點,所以完整的路徑有望成為test/resources/src/test/resources/file.csvtest/resources/src/test/resources/file.csv取決於您如何運行測試。

您可以實現目標的唯一可靠方法是手動注意正確性。 也許是這樣的:

static String getResourceFileName(String maybePath) {
    Path path = Paths.get(maybePath);
    if (path.getNameCount() > 0) {
        return path.getFileName().toString();
    } else {
        throw new IllegalArgumentException("Can't derive filename given " + maybePath);
    }
}

@Test
public void testSoq() throws Exception {
    String fileName0 = getResourceFileName("file");
    InputStream is0 = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName0);

    String fileName1 = getResourceFileName("src/test/resources/file");
    InputStream is1 = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName1);
    String string0 = new BufferedReader(new InputStreamReader(is0)).readLine();
    String string1 = new BufferedReader(new InputStreamReader(is1)).readLine();
    assertEquals(string0, string1); // OK
}

也許您必須根據您的案例的具體情況(考慮可能的嵌套目錄等)來編寫它,但我真的認為鑒於您的輸入可能具有任意性質,這不會變得更簡單。

我在博客上有這個(西班牙語)

http://lacuevadeyogui.blogspot.com/2015/04/diferencia-entre-uri-y-url.html

引用 src/test/resources 中的文件的問題

嘗試這個

URL url = getClass().getClassLoader().getResource("file.csv");
File f;
try {
    f = new File(url.toURI());
} catch (URISyntaxException e) {
    f = new File(url.getPath());
}

最后,將文件轉換為 inputStream。

暫無
暫無

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

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