Я создал JAR-файл для моего Javalin приложения, и код работает нормально. Однако чтение некоторых файлов ресурсов из JAR завершается неудачно с inputStream.available() == 0
, но оно работает как раз для некоторых других файлов.
Следующие файлы должны быть доставлены в самый раз:
a/
|\
| +- a.txt
| +- b.js
| +- c.css
|
b/
\
+- d.png
+- e.txt
Однако InputStream
читает только файлы a/a.txt
, a/b.js
и b/e.txt
. Для всех остальных файлов он ничего не возвращает, и available() == 0
, но он работает, когда я не читаю файлы из JAR, а из извлеченного пути к классам (и я использую ClassLoader
независимо от того, как выглядит среда выполнения лайк). Кроме того, размер файла не имеет значения, a/a.txt
намного больше, чем a/c.css
, поэтому я не знаю, что с этим делать.
Пример кода (как я уже сказал, я использую Javalin для HTTP-запроса / ответа, который обрабатывается в объекте ctx
, и я также используя Apache Tika для определения MIME-типа запрашиваемых файлов, который работает как положено):
// 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);
}
Я что-то здесь упускаю или я делаю что-то не так?