我正在以最佳性能将图像写入servlet响应。有什么建议,做法和经验吗?
最佳答案
为了获得最佳性能和效率,请不要将整个内容放在byte[]
中。是的,每个byte
占用Java内存一个字节。想象一下,有100个并发用户请求每100KB的10张图像,这已经消耗了100MB的Java内存。
使用InputStream
从数据库中获取图像作为ResultSet#getBinaryStream()
,将其包装在BufferedInputStream
中,然后通过一个小的OutputStream
缓冲区将其写入包装在BufferedOutputStream
中的响应的byte[]
中。
假设您通过数据库键选择图像作为标识符,请在HTML中使用它:
<img src="images/123">
创建一个
Servlet
类,该类以web.xml
映射到url-pattern
的/images/*
上,并实现其doGet()
方法,如下所示:Long imageId = Long.valueOf(request.getPathInfo().substring(1)); // 123
Image image = imageDAO.find(imageId); // Get Image from DB.
// Image class is just a Javabean with the following properties:
// private String filename;
// private Long length;
// private InputStream content;
response.setHeader("Content-Type", getServletContext().getMimeType(image.getFilename()));
response.setHeader("Content-Length", String.valueOf(image.getLength()));
response.setHeader("Content-Disposition", "inline; filename=\"" + image.getFilename() + "\"");
BufferedInputStream input = null;
BufferedOutputStream output = null;
try {
input = new BufferedInputStream(image.getContent());
output = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[8192];
for (int length = 0; (length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
} finally {
if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
}
在
ImageDAO#find()
中,您可以使用 ResultSet#getBinaryStream()
从数据库中获取图像作为InputStream
。关于java - 以最佳性能将图像写入servlet响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2979758/