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

时间:2018-09-10 07:49:23

标签: java

我已经创建了一个非常简单的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);
            }
            bos.flush();
            bos.close();
            fos.close();
            is.close();
        }
        zipFile.close();
    }catch(IOException ioe){
        ioe.printStackTrace();
    }finally{
        try{
            if(bos != null){
                bos.close();
            }
            if(fos != null) {
                fos.close();
            }
            if(is != null){
                is.close();
            }
            if(zipFile != null){
                zipFile.close();
            }

        }catch(Exception e) {
            e.printStackTrace();
        }
        return topLevelDirName;
    }
}

但是,除非明确关闭GUI,否则我仍然无法删除zip。

想知道Windows文件句柄有什么关系吗?谢谢。

1 个答案:

答案 0 :(得分:1)

Java 8引入了try-with-resources Statement,以使这种情况更简单,更简洁。

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

--recurse-submodules

我已经稍微更新了代码,以使其变得更简洁,更简单,并充分利用可用的API