GYBYPtree 2022-04-02 15:48 采纳率: 50%
浏览 354
已结题

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

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

我封装了一个将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条回答 默认 最新

  • CSDN专家-link 2022-04-02 16:00
    关注

    就代码来说,你在循环中反复new文件流,但只是在finally中释放了最后一个。是否应该在52行就进行文件流的释放呢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月10日
  • 已采纳回答 4月2日
  • 创建了问题 4月2日

悬赏问题

  • ¥70 刚刚看到一个人的网站居然是通过cname访问的
  • ¥15 Attributeerror:super object has no attribute '__sklearn_tags__'_'
  • ¥15 逆置单链表输出不完整
  • ¥15 宇视vms-B200-A16@R启动不了,如下图所示,在软件工具搜不到,如何解决?(操作系统-linux)
  • ¥500 寻找一名电子工程师完成pcb主板设计(拒绝AI生成式答案)
  • ¥15 关于#mysql#的问题:UNION ALL(相关搜索:sql语句)
  • ¥15 matlab二位可视化能否针对不同数值范围分开分级?
  • ¥15 已经创建了模拟器但是不能用来运行app 怎么办😭自己搞两天了
  • ¥15 关于#极限编程#的问题,请各位专家解答!
  • ¥20 win11账户锁定时间设为0无法登录