GYBYPtree
2022-04-02 15:48
采纳率: 100%
浏览 81

文件流确认已经关闭,但是文件还是被程序占用

问题遇到的现象和发生背景

我封装了一个将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()释放资源,但这显然不能真正解决问题

我想要达到的结果
  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

3条回答 默认 最新

相关推荐 更多相似问题