Java 正在创建zip文件,但其中没有任何文件
我直接从oracle网站复制了这段代码。我在d:\barcode中有两个.png文件。当我运行这个代码时,myfigs.zip是在d:drive中创建的,但是它被损坏了,大小为0kb 代码:-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;
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