2017-04-06 113 views
0

我直接從oracle網站複製此代碼。我在d:\ barcode中有兩個.png文件。而我運行這個代碼myfigs.zip創建在d:驅動器,但它是corruped和0kb大小。壓縮文件正在創建,但沒有任何文件在它

代碼: -

public class Zip { 
static final int BUFFER = 2048; 
public static void main (String argv[]) { 
    try { 
     BufferedInputStream origin = null; 
     FileOutputStream dest = new 
       FileOutputStream("D:\\myfigs.zip"); 
     CheckedOutputStream checksum = new 
       CheckedOutputStream(dest, new Adler32()); 
     ZipOutputStream out = new 
       ZipOutputStream(new 
       BufferedOutputStream(checksum)); 
     //out.setMethod(ZipOutputStream.DEFLATED); 
     byte data[] = new byte[BUFFER]; 
     // get a list of files from current directory 
     File f = new File("D:\\barcode"); 
     String files[] = f.list(); 

     for (int i=0; i<files.length; i++) { 
      System.out.println("Adding: "+files[i]); 
      FileInputStream fi = new FileInputStream(files[i]); 
      origin = new BufferedInputStream(fi, BUFFER); 
      ZipEntry entry = new ZipEntry(files[i]); 
      out.putNextEntry(entry); 
      int count; 
      while((count = origin.read(data, 0, 
        BUFFER)) != -1) { 
       out.write(data, 0, count); 
      } 
      origin.close(); 
     } 
     out.close(); 
     System.out.println("checksum: "+checksum.getChecksum().getValue()); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

每當我調試模式運行代碼的代碼添加更多的信息成功編譯的FileInputStream連接線則停在那裏。拋出的錯誤是

java.io.FileNotFoundException: barcode.png (The system cannot find the file specified) 
Adding: barcode.png 
at java.io.FileInputStream.open0(Native Method) 
at java.io.FileInputStream.open(FileInputStream.java:195) 
at java.io.FileInputStream.<init>(FileInputStream.java:138) 
at java.io.FileInputStream.<init>(FileInputStream.java:93) 

回答

-2

可按照下述代碼用於壓縮一個文件:

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipOutputStream; 

/** 
* Create by Cuder 
* 
*/ 
public class SampleZipFile { 

    /** 
    * Create by Cuder 
    */ 
    public static void main(String[] args) { 
     ZipOutputStream zipOutputStream = null; 
     FileInputStream fileInputStream = null; 
     try { 
      File fileInput = new File(
        "D:\\eclipse4.4\\workspace\\SampleJava\\resource\\sampleZipFile.txt"); 
      File fileOutput = new File(
        "D:\\eclipse4.4\\workspace\\SampleJava\\resource\\sampleZipFile.zip"); 

      FileOutputStream fileOutputStream = new FileOutputStream(fileOutput); 
      zipOutputStream = new ZipOutputStream(fileOutputStream); 
      fileInputStream = new FileInputStream(fileInput); 

      ZipEntry entry = new ZipEntry(fileInput.getName()); 
      zipOutputStream.putNextEntry(entry); 
      byte[] buf = new byte[1024]; 
      int byteRead = 0; 
      while ((byteRead = fileInputStream.read(buf)) > 0) { 
       zipOutputStream.write(buf, 0, byteRead); 
      } 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (null != fileInputStream) { 
        fileInputStream.close(); 
       } 
       if (null != zipOutputStream) { 
        zipOutputStream.close(); 
       } 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    } 

} 
+0

請解釋您的答案中的問題和解決方案,而不是鏈接。 –

+1

如果你能解釋OP代碼中的問題是什麼,它是如何解決的,以及你爲解決問題所做的改變,這會更有用。 –

1

異常說「找不到文件」。你的「並稱」打印語句給你答案:

Adding: barcode.png 

文件「barcode.png」是不一樣的文件「d:\條碼\ barcode.png」。您只需在當前工作目錄設置爲的任何位置查找名爲「barcode.png」的文件,但該文件不存在。

按照你應該從你的打印輸出和異常的意見中提出的文檔爲list(),並得出結論:

名稱表示目錄本身及目錄的父目錄不包括在結果中。每個字符串都是文件名而不是完整的路徑。

所以,你需要:

  • 將工作目錄更改爲 「d:\條形碼」:回( 「\條形碼d」),以第一或
  • 添加父目錄名在打開它之前,你的文件名(「barcode.png」)的開頭,或者
  • Look at some of the other functions File has to offer並查看是否有幫助你完全避免這個問題的文件。

情侶其他次要筆記:

  • 它應該是毫不奇怪的zip文件是空的,因爲你的代碼threw an exception你寫什麼之前。
  • 「每當我在調試模式下運行代碼代碼已成功編譯爲FileInputStream fi行然後它停在那裏」 - 此術語是不正確的。你的錯誤不是編譯器錯誤,它是一個運行時錯誤。代碼編譯得很好。
  • 問題的根本原因是對從Oracle站點複製的代碼進行盲目修改。請注意原始註釋「從當前目錄獲取文件列表」 - 此代碼假定文件來自當前工作目錄。當你添加自己的目錄時,情況就不再是這樣了,程序崩潰了。
+1

非常感謝您的時間和精力來幫助我。我補充說: - FileInputStream fi = new FileInputStream(「D:\\ barcode \\」+ files [i]); 根據您的建議,它的工作。 –

相關問題