Как выпустить файл в графическом интерфейсе java без закрытия

Я создал довольно простой графический интерфейс Java для просмотра / загрузки zip-файла на платформе Windows, чтобы начать распаковку, а затем выполнить некоторую проверку файлов.

Все работает нормально, за исключением того, что мне нужно закрыть окно графического интерфейса, чтобы удалить 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;
    }
}

Однако я все еще не могу удалить zip-архив, если явно не закрою графический интерфейс.

Интересно, связано ли это с дескриптором файла Windows? Заранее спасибо.

Вы используете ZipFile или ZipInputStream? Наверное нужно закрыть те. Вам также лучше использовать инструкцию try-with-resources

MadProgrammer 10.09.2018 09:52

Разместите еще код, пожалуйста.

david a. 10.09.2018 09:52

@ davida.updated

Kevin 10.09.2018 09:57

@MadProgrammer да, это ZipFile

Kevin 10.09.2018 09:57

В этом примере используется класс-оболочка с именем ZipFileSource и метод override close (). может быть полезно: stackoverflow.com/questions/36291737/…

Pasha GR 10.09.2018 10:04
1
5
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Java 8 представила Заявление о попытках с ресурсами, чтобы упростить и очистить такую ​​ситуацию.

Одна из ваших проблем заключается в том, что если какая-либо из попыток закрыть множество открытых вами ресурсов не удастся, то ни один из остальных не будет закрыт.

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.

спасибо, я пробовал ваш код, но кажется, все еще не позволяет мне удалить zip-файл. Может я что-то упускаю?

Kevin 10.09.2018 10:33

Я не знаю, так как это весь код, который вы предоставили. Этот пример мне подходит, может быть, что-то еще держит файл открытым? Может попробовать перезагрузить компьютер

MadProgrammer 10.09.2018 10:34

отлично, на самом деле другой сервис держит ссылку на zipFile и не закрывается. Теперь работает спасибо!

Kevin 10.09.2018 10:36

Другие вопросы по теме