Распаковать файлы не в точном формате

Я хочу разархивировать все папки и файлы разных типов, такие как.xls,.apk,.png и т.д. Но при извлечении всех файлов они находятся во вновь извлеченном foder (или папках под этой папкой). но эти.xml,.png,.apk файлы не в правильном формате. когда я открываю файл xls, он показывает поп, формат которого может быть другим, а также когда он открывает файлы, все содержимое находится в другом формате. .png файлы также не могут быть открыты, ни.apk не полезны после извлечения. почему это происходит? **

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
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.ZipInputStream;

public class UnzipFiles {

 public static void main(String a[]){

 UnzipFiles mfe = new UnzipFiles();
 mfe.unzipFile("E:/New folder/pics.zip");
 }
 public void unzipFile(String filePath){

 FileInputStream fis = null;
 ZipInputStream zipIs = null;
 ZipEntry zEntry = null;
 try {
 fis = new FileInputStream(filePath);
 zipIs = new ZipInputStream(new BufferedInputStream(fis));
 while((zEntry = zipIs.getNextEntry()) != null){
 try{
 byte[] tmp = new byte[25*1024*1024];
 FileOutputStream fos = null;
 /*String opFilePath = "E:/New folder/new/"+zEntry.getName();*/
 String opFilePath= "E:/New folder/new"+File.separator+zEntry.getName();
 File f = new File( opFilePath); 
 if(zEntry.isDirectory())
 { f.mkdirs();
 System.out.println(f.getName()+" "+"folder created");
 }

 else{
 System.out.println(f.getName());
 /*System.out.println("Extracting file to "+opFilePath);*/
 fos = new FileOutputStream(f);
 BufferedOutputStream out = new BufferedOutputStream(fos);

 int size = 0;
 int k= zipIs.read(tmp);
 System.out.println(k+1);
 while((size = zipIs.read(tmp)) != -1){
 out.write(tmp, 0 , size);

 }

 }

 } catch(Exception ex){
 ex.printStackTrace();
 }

 }
 zipIs.closeEntry();
 zipIs.close();

 } catch (FileNotFoundException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 } catch (IOException exc) {
 // TODO Auto-generated catch block
 exc.printStackTrace();
 }
 }


}

**

1 ответ

Вы забываете помещать первые байты, которые вы читаете в файл назначения:

int k= zipIs.read(tmp); // <--- HERE
 System.out.println(k+1);
 while((size = zipIs.read(tmp)) != -1){
 out.write(tmp, 0 , size);

Кроме того, если вы используете Java 7, вместо этого используйте ZIP FileSystem вместе с Files.walkFileTree(); что сделает вашу работу намного проще!

licensed under cc by-sa 3.0 with attribution.