欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java?zip文件解壓后無法刪除原zip文件問題

 更新時間:2024年06月17日 08:48:42   作者:香蕉加奶茶  
這篇文章主要介紹了java?zip文件解壓后無法刪除原zip文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

java zip文件解壓后無法刪除原zip文件

在Java程序中,我們經(jīng)常需要處理文件的壓縮和解壓縮。

Java提供了一些常用的類和方法來處理文件的解壓縮,如java.util.zip.ZipFile和java.util.zip.ZipEntry。

然而,有時在解壓縮文件后,我們可能遇到原文件無法刪除的問題。

本文將介紹這個問題的原因和解決方法,并提供相關(guān)的代碼示例。

private static void extractZip(String zipFilePath, String destDirPath) throws IOException {
        try {
            ZipFile zipFile = new ZipFile(zipFilePath);
            Enumeration<? extends ZipEntry> entries = zipFile.entries();
            while (entries.hasMoreElements()) {
                ZipEntry entry = entries.nextElement();
                File entryDestination = new File(destDirPath, entry.getName());
                entryDestination.getParentFile().mkdirs();
                if (!entry.isDirectory()) {
                    zipFile.getInputStream(entry);
                }
            }
            zipFile.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 刪除原文件
        File zipFile = new File(zipFilePath);
        if (zipFile.exists()) {
            zipFile.delete();
        }
 }

在運(yùn)行以上代碼后,我們可能會遇到一個問題:

無法刪除原壓縮文件example.zip。

即使我們已經(jīng)關(guān)閉了解壓縮過程中使用的ZipFile對象,依然無法刪除這個文件。那么,為什么會出現(xiàn)這個問題呢?

問題原因

Java的ZipFile類在實(shí)例化后,會在操作系統(tǒng)中打開一個文件句柄。

這個文件句柄指向一個文件,并且在Java程序中被引用。

當(dāng)我們嘗試刪除原文件時,操作系統(tǒng)會認(rèn)為文件仍然被使用,因此無法刪除。

解決方法

為了解決這個問題,我們可以使用Java的ZipInputStream類來代替ZipFile類。

ZipInputStream可以從輸入流中讀取壓縮文件的內(nèi)容,而不需要在操作系統(tǒng)中打開一個文件句柄。在解壓縮完成后,我們關(guān)閉輸入流,并刪除原文件。

以下是修改后的代碼示例:

private static void extractZip(String zipFilePath, String destDirPath) throws IOException {
        File destDir = new File(destDirPath);
        if (!destDir.exists()) {
            destDir.mkdirs();
        }

        byte[] buffer = new byte[1024];
        ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath));
        ZipEntry zipEntry = zis.getNextEntry();
        while (zipEntry != null) {
            File newFile = new File(destDir, zipEntry.getName());
            FileOutputStream fos = new FileOutputStream(newFile);
            int len;
            while ((len = zis.read(buffer)) > 0) {
                fos.write(buffer, 0, len);
            }
            fos.close();
            zipEntry = zis.getNextEntry();
        }
        zis.closeEntry();
        zis.close();

        // 刪除原文件
        File zipFile = new File(zipFilePath);
        if (zipFile.exists()) {
            zipFile.delete();
        }

    }

通過使用ZipInputStream類,我們可以避免打開文件句柄并成功刪除原文件。

java讀取zip文件流并解壓

場景

近日測試一個下載接口,該接口返回字節(jié)數(shù)組形式的zip文件,于是想利用該字節(jié)數(shù)組進(jìn)行zip解壓并對其中的文件做進(jìn)一步解析操作

實(shí)現(xiàn)

   public void zipParse(byte[] content) throws IOException{
        //將包含壓縮包信息的字節(jié)數(shù)組轉(zhuǎn)化為zipInputStream
        ZipInputStream zipInputStream= new ZipInputStream(new ByteArrayInputStream(content,0,content.length));
        //獲得壓縮包中第一個文件入口
        zipInputStream.getNextEntry();
        //讀取第一個文件的字節(jié)數(shù)組
        byte[] excelByteArray=zipInputStream.readAllBytes();
        zipInputStream.close();
        //將第一個文件的字節(jié)數(shù)組轉(zhuǎn)化為輸入流
        InputStream input=new ByteArrayInputStream(excelByteArray,0,excelByteArray.length);

        //表格解析
        Workbook book = WorkbookFactory.create(input);
        input.close();
        Assert.assertNotNull(book,"表格內(nèi)容為空");
    }

特點(diǎn)

不生成臨時文件,僅在內(nèi)存層面進(jìn)行操作

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mybatis映射文件詳解之mapper.xml文件

    Mybatis映射文件詳解之mapper.xml文件

    本文詳細(xì)介紹了Mybatis映射文件的結(jié)構(gòu)、標(biāo)簽和使用方法,包括mapper元素、標(biāo)簽的主要屬性如id、parameterType、resultType以及動態(tài)SQL和結(jié)果映射的使用,通過映射文件,可以將數(shù)據(jù)庫表與Java對象映射,支持查詢、插入、更新、刪除等操作,提高了SQL語句的靈活性和可重用性
    2024-09-09
  • SpringAOP中的Advisor詳解

    SpringAOP中的Advisor詳解

    這篇文章主要介紹了SpringAOP中的Advisor詳解,平時我們項(xiàng)目中涉及到?AOP,基本上就是聲明式配置一下就行了,無論是基于?XML?的配置還是基于?Java?代碼的配置,都是簡單配置即可使用,今天就來看一下聲明式配置的使用,需要的朋友可以參考下
    2023-08-08
  • java如何自定義注解

    java如何自定義注解

    這篇文章主要介紹了java如何自定義注解問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Java報錯Java.text.ParseException的解決方法匯總

    Java報錯Java.text.ParseException的解決方法匯總

    在Java開發(fā)的復(fù)雜世界中,錯誤處理是開發(fā)者必須面對的關(guān)鍵挑戰(zhàn)之一,其中,Java.text.ParseException就像一個隱藏在代碼叢林中的陷阱,常常讓開發(fā)者們陷入困惑,本文給大家介紹了Java報錯Java.text.ParseException的解決方法,需要的朋友可以參考下
    2024-10-10
  • 詳解java google Thumbnails 圖片處理

    詳解java google Thumbnails 圖片處理

    這篇文章主要介紹了java google Thumbnails 圖片處理的相關(guān)知識,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java數(shù)據(jù)結(jié)構(gòu)之有效隊列定義與用法示例

    Java數(shù)據(jù)結(jié)構(gòu)之有效隊列定義與用法示例

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之有效隊列定義與用法,結(jié)合實(shí)例形式分析了java有效隊列的數(shù)據(jù)插入、刪除、判斷、計算等相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • Mybatis兩種不同批量插入方式的區(qū)別

    Mybatis兩種不同批量插入方式的區(qū)別

    隨著業(yè)務(wù)需要,有時我們需要將數(shù)據(jù)批量添加到數(shù)據(jù)庫,mybatis提供了將list集合循環(huán)添加到數(shù)據(jù)庫的方法,這篇文章主要給大家介紹了關(guān)于Mybatis兩種不同批量插入方式的區(qū)別,需要的朋友可以參考下
    2021-09-09
  • Java JDK1.5、1.6、1.7新特性整理

    Java JDK1.5、1.6、1.7新特性整理

    這篇文章主要介紹了Java JDK1.5、1.6、1.7新特性整理,需要的朋友可以參考下
    2016-10-10
  • Java實(shí)現(xiàn)二叉堆、大頂堆和小頂堆

    Java實(shí)現(xiàn)二叉堆、大頂堆和小頂堆

    二叉堆就是完全二叉樹,或者是靠近完全二叉樹結(jié)構(gòu)的二叉樹。大頂堆要求對于一個節(jié)點(diǎn)來說,它的左右節(jié)點(diǎn)都比它小;小頂堆要求對于一個節(jié)點(diǎn)來說,它的左右節(jié)點(diǎn)都比它大。本文將用Java分別實(shí)現(xiàn)二叉堆、大頂堆和小頂堆。需要的可以參考一下
    2022-01-01
  • Java實(shí)現(xiàn)bmp和jpeg圖片格式互轉(zhuǎn)

    Java實(shí)現(xiàn)bmp和jpeg圖片格式互轉(zhuǎn)

    本文主要介紹了Java實(shí)現(xiàn)bmp和jpeg圖片格式互轉(zhuǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評論