我在Tomcat 5.5中有一个Servlet,可以读取坐在文件夹中的本地图像。然后将图像发送回Applet。
我收到此“javax.imageio.IIOException:无法创建ImageInputStream!”错误,不确定是什么原因引起的。
有人遇到过这个问题吗?这可能是ImageIO中的线程问题吗?我无法重现此问题,因为每1000个请求大约发生3次。
编辑:这是读取图像的Servlet代码。我只是在Servlet的doPost方法中以其静态形式使用ImageIO.read(File),如下所示:
doPost(req,resp){
...
BufferedImage image = ImageIO.read(imageFile);
...
}
这是javax.imageio.ImageIO.read(File)的源代码:
public static BufferedImage read(File input) throws IOException {
if (input == null) {
throw new IllegalArgumentException("input == null!");
}
if (!input.canRead()) {
throw new IIOException("Can't read input file!");
}
ImageInputStream stream = createImageInputStream(input);
if (stream == null) {
throw new IIOException("Can't create an ImageInputStream!");
}
BufferedImage bi = read(stream);
if (bi == null) {
stream.close();
}
return bi;
}
最佳答案
我的消息源(Java5,但我怀疑它已经发生了很大变化)指出,如果没有注册ImageInputStream服务提供者,则createImageInputStream
方法将返回null,因此您将获得该异常。
从IIORegistry.getDefaultInstance()
使用的ImageIO
上的JavaDoc中:
每个ThreadGroup将接收自己的实例;这允许在同一浏览器(例如)中的不同Applet各自拥有自己的注册表。
因此,实际上可能是线程问题,因为您获得了IIORegistry
的新实例。
编辑:深入研究源代码,我发现以下内容:
因为您传入文件,所以很可能会收到FileImageInputStream
。但是,如果发生异常,服务提供商将返回null
。因此,可能会抛出FileNotFoundException
或任何其他IOException
,从而导致无法创建流。
不幸的是,没有登录代码,因此您必须以某种方式进行调试。可能是由于缺少文件权限,文件损坏/不完整或文件丢失。
这是FileImageInputStreamSpi#createInputStreamInstance()
的Java5源代码
public ImageInputStream createInputStreamInstance(Object input,
boolean useCache,
File cacheDir) {
if (input instanceof File) {
try {
return new FileImageInputStream((File)input);
} catch (Exception e) {
return null;
}
} else {
throw new IllegalArgumentException();
}
}
关于java - javax.imageio.ImageIO创建ImageInputStream时出现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6929230/