[英]Java InputStream object using getResourceAsStream is null when calling from web application but works when run in Eclipse
[英]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.csv
是src/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.csv
或test/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.