为了账号安全,请及时绑定邮箱和手机立即绑定

如何在不关闭的情况下在 Java GUI 中释放文件

如何在不关闭的情况下在 Java GUI 中释放文件

慕婉清6462132 2021-09-12 14:27:06
我创建了一个非常简单的 Java GUI 来浏览/加载 Windows 平台上的 zip 文件以开始解压缩,然后进行一些文件检查。一切正常,除了我必须关闭 GUI 窗口才能删除已在 GUI 中打开的 zip 文件。在解压方法的 finally 块中,我尝试添加以下内容:public static String unZip(String path){    int count = -1;    String savepath = "";    File file = null;    InputStream is = null;    FileOutputStream fos = null;    BufferedOutputStream bos = null;    savepath = path.substring(0, path.lastIndexOf("\\")) + File.separator; //File saving directory    new File(savepath).mkdir(); //create the saving directory    ZipFile zipFile = null;    String topLevelDirName="";    try    {        zipFile = new ZipFile(path,Charset.forName("gbk")); //Encoding        Enumeration<?> entries = zipFile.entries();        int levelCount=0;        while(entries.hasMoreElements())        {            byte buf[] = new byte[buffer];            ZipEntry entry = (ZipEntry)entries.nextElement();            String filename = entry.getName();            boolean ismkdir = false;            if(filename.lastIndexOf("/") != -1){ //To check if there is a directory                ismkdir = true;            }            filename = savepath + filename;            if(entry.isDirectory()){ //If it is a directory                levelCount++;                file = new File(filename);                file.mkdirs();                if(levelCount==1)                    topLevelDirName = filename;                continue;            }            file = new File(filename);            if(!file.exists()){                if(ismkdir){                    new File(filename.substring(0, filename.lastIndexOf("/"))).mkdirs();                }            }            file.createNewFile(); //Create the file            is = zipFile.getInputStream(entry);            fos = new FileOutputStream(file);            bos = new BufferedOutputStream(fos, buffer);            while((count = is.read(buf)) > -1)            {                bos.write(buf, 0, count);            }           但是,除非明确关闭 GUI,否则我仍然无法删除 zip。想知道是否与 Windows 文件句柄有关?提前致谢。
查看完整描述

1 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

Java 8 引入了try-with-resources 语句,使这种情况更简单、更清晰。


您遇到的问题之一是,如果关闭您打开的许多资源的任何一种尝试失败,那么其他任何资源都不会被关闭


public static String unZip(String path) throws IOException {

    int count = -1;


    File sourceFile = new File(path);

    String name = sourceFile.getName();

    name = name.substring(0, name.lastIndexOf(".zip"));

    File sourcePath = new File(sourceFile.getParent(), name);


    System.out.println("SavePath = " + sourcePath);

    if (!sourcePath.exists() && !sourcePath.mkdirs()) {

        throw new IOException("Could not create directory " + sourcePath);

    }

    String topLevelDirName = "";

    try (ZipFile zipFile = new ZipFile(sourceFile)) {

        Enumeration<?> entries = zipFile.entries();

        int levelCount = 0;

        byte buf[] = new byte[1024];

        while (entries.hasMoreElements()) {

            ZipEntry entry = (ZipEntry) entries.nextElement();

            String filename = entry.getName();

            File file = new File(sourcePath, filename);

            if (entry.isDirectory()) { //If it is a directory

                levelCount++;

                System.out.println("Make directory " + file);

                if (!file.exists() && !file.mkdirs()) {

                    throw new IOException("Could not create directory " + filename);

                }

            } else {

                System.out.println("Extract to " + file);

                try (InputStream is = zipFile.getInputStream(entry);

                                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file))) {

                    while ((count = is.read(buf)) > -1) {

                        bos.write(buf, 0, count);

                    }

                }

            }

        }

    }

    return topLevelDirName;

}

我已经稍微更新了代码,以尝试使其更清晰、更简单,并利用可用的 API


查看完整回答
反对 回复 2021-09-12
  • 1 回答
  • 0 关注
  • 228 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信