Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java InputStream不会从JAR读取某些文件_Java_Jar_Inputstream_Javalin - Fatal编程技术网

Java InputStream不会从JAR读取某些文件

Java InputStream不会从JAR读取某些文件,java,jar,inputstream,javalin,Java,Jar,Inputstream,Javalin,我已经为我的应用程序构建了一个JAR文件,代码运行良好。但是,从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文件,代码运行良好。但是,从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
大得多,所以我没有这方面的线索

一些示例代码(如我所说,我用于HTTP请求/响应,该请求/响应在对象中处理,我还用于检测所请求文件的MIME类型,该类型按预期工作):


我是在这里遗漏了什么还是做错了什么?

我怀疑MIME类型检测可能是原因。首先,试着省去它,看看它是否能解决你的问题

我怀疑:
tika.detect()
显然需要消耗给定流中的字节才能检测到任何东西。仅当支持标记时才能重置流的状态。因此,您应该验证
classLoader.getResourceAsStream()
返回的
InputStream的

如果没有,Tika可能会消耗文件的所有内容,直到它能够确定文件类型,然后无法重置流,然后您就没有东西可以发送到客户端。在这种情况下,您应该将原始的
InputStream
包装在
BufferedInputStream
中(添加了标记/重置功能),并将其用于tika和发送内容



顺便说一句:您应该使用确保所有输入流、流读取器和缓冲读取器都已关闭,即使在引发异常时也是如此。

available()并不像您想象的那样。事实上,你可以说它是无用的。所以,如果你在使用它,你就做错了什么,它不会工作。尽量不要使用它,并用其他东西替换你认为你正在用它做的任何事情。但是,HTTP客户端没有接收任何内容。事实上,当从JAR中读取时,所有具有
available()==0
的文件的响应长度都是0字节。无论如何,当我从JAR中删除
available()
的所有用法(让Jetty计算
内容长度
)时,我的代码仍然无法从JAR中工作……显然
tika.detect()
正在消耗输入流中的字节:在某些情况下,它们都是。@EJP我敢打赌,文本文件会检测到这些字节。InputStream提供了mark(),它很可能适用于jar资源的所有Java实现,Tika最有可能使用它。@AlexanderLeithner对可用()==0的文件的响应为空,因为您声明这些文件的长度为零字节。您是否可以显示不使用available()时代码的外观,以及“不工作”的确切含义?你的代码真的不应该去翻汉堡。我知道我的代码缺乏异常处理,我目前只是在寻找解决这个问题的方法。无论如何,谢谢你!
// 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);
}