Java 正在创建zip文件,但其中没有任何文件

Java 正在创建zip文件,但其中没有任何文件,java,Java,我直接从oracle网站复制了这段代码。我在d:\barcode中有两个.png文件。当我运行这个代码时,myfigs.zip是在d:drive中创建的,但是它被损坏了,大小为0kb 代码:- public class Zip { static final int BUFFER = 2048; public static void main (String argv[]) { try { BufferedInputStream origin = null;

我直接从oracle网站复制了这段代码。我在d:\barcode中有两个.png文件。当我运行这个代码时,myfigs.zip是在d:drive中创建的,但是它被损坏了,大小为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();
    }
}
}
公共类Zip{
静态最终整数缓冲区=2048;
公共静态void main(字符串argv[]){
试一试{
BufferedInputStream原点=null;
FileOutputStream dest=新建
FileOutputStream(“D:\\myfigs.zip”);
CheckedOutputStream校验和=新
CheckedOutputStream(dest,new Adler32());
ZipOutputStream out=新
ZipOutputStream(纽约州)
缓冲输出流(校验和);
//out.setMethod(ZipOutputStream.DEFLATED);
字节数据[]=新字节[缓冲区];
//从当前目录获取文件列表
文件f=新文件(“D:\\barcode”);
字符串文件[]=f.list();

对于(int i=0;i,您可以使用以下代码作为zip文件:

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();
            }
        }

    }

}
异常为“未找到文件”。您的“添加”打印语句给出了答案:

Adding: barcode.png
文件“barcode.png”与文件“D:\barcode\barcode.png”不同。您只需在当前工作目录中查找名为“barcode.png”的文件,但该文件不存在

根据文件以及您根据对打印输出和例外情况的观察得出的结论:

结果中不包括表示目录本身和目录父目录的名称。每个字符串都是文件名,而不是完整路径

因此,您需要:

  • 首先将工作目录更改为“D:\barcode”,或者
  • 在打开父目录名称(“D:\barcode”)之前,将其添加回文件名(“barcode.png”)的开头,或者
  • 看看是否有一种方法可以帮助你完全避免这个问题
两个小音符:

  • 考虑到在编写任何东西之前,您的代码是空的,因此zip文件是空的就不足为奇了
  • “每当我在调试模式下运行代码时,代码成功编译到FileInputStream fi行,然后它就停止在那里”-这个术语不正确。您的错误不是编译器错误,而是运行时错误。代码编译得很好
  • 问题的根本原因是盲目修改从Oracle站点复制的代码。请注意原始注释“从当前目录获取文件列表”-此代码假定文件来自当前工作目录。当您在中添加自己的目录时,情况不再如此,程序中断

请在您的答案中解释问题和解决方案,而不是在链接中。如果您能解释OP代码中的问题、如何解决问题以及您为解决问题所做的更改,这将更加有用。非常感谢您花费时间和精力帮助我。我添加了:-FileInputStream fi=new FileInputStream(“D:\\barcode\\”+根据你的建议,它起了作用。
Adding: barcode.png