1. 程式人生 > >關於壓縮檔案後刪除原始檔的一點問題

關於壓縮檔案後刪除原始檔的一點問題

近期在專案中,需要壓縮檔案,同時壓縮檔案後需要刪除原始檔,

public static boolean fileToZip(String sourceFilePath,String zipFilePath,String zipFileName){
boolean flag = false;
    File sourceFile = new File(sourceFilePath);
    FileInputStream fis = null;
    BufferedInputStream bis = null;
    FileOutputStream fos = null;
    ZipOutputStream 
zos = null; if (!sourceFile.exists()){ log.error("待壓縮的檔案目錄,sourceFilePath={},不存在",sourceFilePath ); }else { try { File zipFile = new File(zipFilePath + File.separator + zipFileName + ".zip"); if (zipFile.exists()){ log.error("檔案已存在,zipFile={}",zipFile ); } else { File
[] files = sourceFile.listFiles(); if (files != null && files.length > 0){ fos = new FileOutputStream(zipFile); zos = new ZipOutputStream(new BufferedOutputStream(fos)); byte[] bufs = new byte[1024*10]; for (File file
: files) { //建立zip實體並新增進壓縮包 ZipEntry zipEntry = new ZipEntry(file.getName()); zos.putNextEntry(zipEntry); //讀取待壓縮的檔案, 並寫進壓縮包 fis = new FileInputStream(file); bis = new BufferedInputStream(fis,1024*10); int read = 0; while ((read = bis.read(bufs,0 ,1024*10 )) != -1){ zos.write(bufs,0 ,read ); }                         //這句一開始沒有, bis.close(); } flag = true; } } } catch (Exception e) { e.printStackTrace(); } finally { //關閉流 if (bis != null) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } if (zos != null) { try { zos.close(); } catch (IOException e) { e.printStackTrace(); } } File[] files = sourceFile.listFiles(); for (File file : files) { //刪除原始檔 file.delete(); } } } return flag; }

剛開始一直刪不掉,也判斷是流沒有關閉,後來在大佬提示下,

                        fis = new FileInputStream(file);
                        bis = new BufferedInputStream(fis,1024*10);

才明白,我的這兩個流,因為是在迴圈體裡面放的,會造成堆疊的孤島問題, 我每次迴圈一次就新建了一個input流,導致之前的input流成為棧記憶體中的孤島,沒有被GC回收,佔用了檔案,才會一直刪不掉,後來在 迴圈體中 加上

bis.close();

bingo,問題解決

思考: 對於基礎的堆疊的不熟悉,導致了這個問題卡了我一下午,有空還是應該多看看java的基礎,不能覺得基礎不重要!!!!