问题遇到的现象和发生背景
我封装了一个将pdf截成图片的方法,程序中将用到的文件流都在finally中关闭了,但生成的图片还是有一两张被程序占用,请大家帮忙测试下问题所在
问题相关代码,请勿粘贴截图
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
/**
* pdf转图片
* @param pdffile 待处理pdf
* @param folderPath 转换后图片存放目录
* @param splitNum 每页pdf截取图片数量
*/
public void createAllPdfImage(File pdffile, String folderPath, int splitNum) {
File imgFile = null;
InputStream inputStream = null;
OutputStream outputStream = null;
PDDocument pdfdocument = null;
ByteArrayOutputStream os = null;
try {
pdfdocument = PDDocument.load(pdffile);
PDFRenderer pdfrenderer = new PDFRenderer(pdfdocument);
int pageCount = pdfdocument.getNumberOfPages(); //pdf总页数
for (int page = 0; page < pageCount; page++) {
for (int count = 0; count < splitNum; count++) {
// 第几页PDF
String imgName = page + "_" + count + ".png";
imgFile = new File(folderPath + File.separator + imgName);
//将此页转成图片
BufferedImage pageImg = pdfrenderer.renderImageWithDPI(page, 150);
BufferedImage image = new BufferedImage(pageImg.getWidth() / splitNum, pageImg.getHeight(),
BufferedImage.TYPE_INT_RGB);
//截取图片
image = pageImg.getSubimage(count * pageImg.getWidth() / splitNum, 0, pageImg.getWidth() / splitNum,
pageImg.getHeight());
os = new ByteArrayOutputStream();
ImageIO.write(image, "png", os);
inputStream = new ByteArrayInputStream(os.toByteArray());
outputStream = new FileOutputStream(imgFile);
byte[] buf = new byte[1024];
int len;
while ((len = inputStream.read(buf)) > 0) {
outputStream.write(buf, 0, len);
}
outputStream.flush();
}
}
} catch (Exception e) {
// TODO: handle exception
log.error("生成pdf所有图片失败", e);
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
if (pdfdocument != null) {
pdfdocument.close();
}
if (os != null) {
os.close();
}
} catch (Exception e2) {
// TODO: handle exception
log.error("生成pdf所有图片文件流关闭失败", e2);
}
}
}
运行结果及报错内容
程序运行完只有部分图片被程序占用无法删除,其他的又是正常的可以删除
我的解答思路和尝试过的方法
目前我只能在合适的位置调用System.gc()释放资源,但这显然不能真正解决问题