我正在使用
javax.imageio.ImageIO class
sun提供的那个不支持读取.tif文件。因此,如果我尝试读取.tif文件,它只返回一个null。然后我从oracle的网站下载了这个api并将其包含在classpath中。这个api使用jni,因为该文件夹中的.so文件很明显。之后,我不必更改代码中的任何内容,而且它有效。怎么会发生这种情况?班级名字不会发生冲突吗?
我下载的api中有3件事情:
我没有必要做任何额外的导入。实际上,ImageIO类提供的功能已经增强了
我很好奇这是如何运作的。
这是javax.imageio包中的类。该课程已被宣布为最终成绩。它做了一些我无法理解的奇怪复杂的东西。有人可以通过一个更简单的例子解释如何实现这种效果。
http://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html
答案 0 :(得分:4)
ImageIO
有scanForPlugins(...)
方法。我想,在类加载时,它需要查看CLASSPATH并查找可以扩展其功能的任何内容。
The javadoc which hints to this is here
你可以通过在一个类中放置一个静态块来做类似的事情
public class MyClass {
public static scanForExtensions() {
... code looking for extensions goes here ...
... for each found extension, register them in the "ExtensionRegistry"
ExtensionRegistry.register(extension);
}
static {
scanForExtensions();
}
public void doSomething(String input) {
for (Extension extension : ExtensionRegistry.getExtensions()) {
if (extension.canHandle(input)) {
extension.handle(input);
return;
}
}
throw UnhandledInputException("No extension to handle " + input);
}
}
答案 1 :(得分:2)
Java的Image IO使用服务提供者接口工作(有关详细信息,请参阅下面的链接)。
JavaSound的工作方式相同。要向(例如)MP3添加对JavaSound的支持,只需要将JMF的mp3plugin.jar
添加到运行时类路径,然后JavaSound可以像WAV一样轻松地解码MP3文件(使用完全相同的类 - 非常时髦。
我希望通过在JRE的lib
目录中添加一堆不同图像类型的服务提供程序,JAI的安装也做了类似的事情。