我为我的Javalin应用程序构建了一个 JAR 文件,并且代码运行良好。但是,从 JAR 中读取一些资源文件失败并显示inputStream.available() == 0
,但它适用于其他一些文件。
以下文件应正确交付:
a/
|\
| +- a.txt
| +- b.js
| +- c.css
|
b/
\
+- d.png
+- e.txt
但是,仅InputStream
读取文件a/a.txt
和. 对于所有其他文件,它什么都不返回,并且,但是当我不是从 JAR 中读取文件而是从提取的 Classpath 中读取文件时(并且无论执行环境是什么样的,我都在使用)。另外,文件大小无关紧要,比 大得多,所以我对此一无所知。a/b.js
b/e.txt
available() == 0
ClassLoader
a/a.txt
a/c.css
一些示例代码(正如我所说,我将Javalin用于对象中正在处理的 HTTP 请求/响应,ctx
并且我还使用Apache Tika来检测所请求文件的 MIME-Type,它按预期工作):
// Example, real path is (correctly) fetched from the Context (ctx) object
String path = "a/c.css";
ClassLoader classLoader = Thread.currentThread ().getContextClassLoader ();
InputStream inputStream = classLoader.getResourceAsStream (path);
String contentType = tika.detect (inputStream, path);
ctx.header ("Content-Type", contentType);
if (contentType.contains ("text") || contentType.contains ("script")) {
InputStreamReader streamReader = new InputStreamReader (inputStream);
BufferedReader reader = new BufferedReader (streamReader);
String line;
StringBuilder builder = new StringBuilder ();
while ((line = reader.readLine ()) != null) {
builder.append (line).append ("\n");
}
String result = builder.toString ();
ctx.header ("Content-Length", String.valueOf (result.length ()));
ctx.result (result);
reader.close ();
} else {
ctx.header ("Content-Length", String.valueOf (inputStream.available ()));
ctx.result (inputStream);
}
我在这里遗漏了什么还是我做错了什么?