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

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

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

我封装了一个将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日

悬赏问题

  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 急matlab编程仿真二阶震荡系统
  • ¥20 TEC-9的数据通路实验
  • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
  • ¥30 求解达问题(有红包)
  • ¥15 请解包一个pak文件