1

我有以下问题:

我创建了应该绘制动态图的 servlet。在绘图过程中,它应该从另一个目录中获取图片并将其绘制到另一个图像上。一切都应该正常工作:

try {
            BufferedImage temp = ImageIO.read(new File("image/arrow.png"));
            tempIm = temp.getScaledInstance(55, 55, Image.SCALE_SMOOTH);
        } catch (IOException e) {

            e.printStackTrace();

        }

但它会打印以下内容:

SEVERE: javax.imageio.IIOException: Can't read input file! at javax.imageio.ImageIO.read(ImageIO.java:1275) at CertificateDraw.doGet(CertificateDraw.java:36)

我试图以所有可能的方式更改 File 对象的路径,即使图像的一部分仍然发送到浏览器,它也会出现同样的问题。所以问题出在 ImageIO.read 部分 - 我怎样才能找到它不加载图像的原因?!

我在 Eclipse 中工作 - servlet 在 src 文件夹中。该图像位于 rot 目录“WebContent”下的“image”文件夹中。

4

1 回答 1

1

中的相对路径java.io.File相对于当前工作目录 (CWD)。这是在发出命令以启动 Java 运行时环境(在您的情况下为网络服务器)时当前打开的文件夹。在 Eclipse 中启动服务器时,这通常是/bin项目的文件夹。您可以通过打印来计算这一点new File(".").getAbsolutePath()

但是您根本不应该依赖相对路径File。CWD 不能从代码内部控制。

由于它已经在 webcontent 文件夹中,因此只需获取它即可ServletContext#getResourceAsStream()

InputStream input = getServletContext().getResourceAsStream("/image/arrow.png");
BufferedImage image = ImageIO.read(input);
// ...

请注意,getServletContext()继承自扩展的GenericServletHttpServlet,因此您不需要自己提供该方法。

于 2012-05-14T21:01:41.183 回答