# zipArchiv byte[] einlesen und in ein neues zipFile kopieren



## Saskia21 (1. April 2008)

Hi

Ich lese ein ZipArchiv byteweise ein.
Dieses byte[] will ich wieder in ein zipArchiv umwandeln. So wie ich es gemacht habe ist es so, dass in dem ziparchiv nocheinmal das zipachriv enthalten ist, dass ich einlesen wollte, dass allerdings fehlerhaft ist und es enthält auch den eigentlichen Inhalt vom ZipArchiv
.

```
byte[] array = w.getDatabaseUpdate("111");
         FileOutputStream f = new FileOutputStream("c:/zip.zip");
         f.write(array);
         f.flush();
         f.close();
```
w.getDatabaseUpdate("111"); -> erzeugt ein Zip Archiv aus mehreren xml-dateien
-> liest das zip Archiv byteweise ein und übergibt es in einem byte[]

Eigentlich soll die Ordnerstruktur so sein:
archiv.zip
-a.xml
-b.xml
-c.xml

sie ist aber so:
archiv.zip
-blub.zip(das voher in der Methode erzeuge zip -> ist fehlerhaflt, lässt sich nicht öffnen)
-a.xml
-b.xml
-c.xml

Hoffe jemand weiß rat

LG


----------



## zerix (1. April 2008)

Hallo,


```
w.getDatabaseUpdate("111");
```
Ist das eine Klasse von dir? Falls ja, poste mal bitte, was diese Methode macht.

MFG

Sascha


----------



## Saskia21 (1. April 2008)

```
public byte[] getDatabaseUpdate(String hashcode) throws IOException {
		if(hc.checkHashCode(hashcode) == true){
			File zipArchiv = zipGenerator.createZip();
			System.out.println(zipArchiv.getName());
			zipByte = changeToByte.changeToByte(zipArchiv);
			return zipByte;
		}
		return null;
	}
```
File zipArchiv = zipGenerator.createZip(); -> bei dem Aufruf bekomme ich ein zipArchiv mit mehreren xml-dateien. (Wäre zu viel es hier zu posten)

zipByte = changeToByte.changeToByte(zipArchiv); -> wird das File byteweise eingelesen

```
public byte[] changeToByte(File file) throws IOException {
	
	          final ByteArrayOutputStream bo;
	
	          final long length = file.length();
	 
	          if (length < Integer.MAX_VALUE) {
	        	  bo = new ByteArrayOutputStream((int) length);
	
	          } else {

	              bo = new ByteArrayOutputStream(Integer.MAX_VALUE);
	          }
	          final FileInputStream in = new FileInputStream(file);
	          int c;
	          while ((c = in.read()) != -1) {
	              bo.write(c);
	          }
	          in.close();
	          bo.close();
	          final byte[] byteArray = bo.toByteArray();
	          return byteArray;
	      }
```


----------



## zerix (1. April 2008)

Hast du mal kontrolliert, ob die Zip-Datei, die vom zipGenerator erstellt wird, schon richtig ist?

MFG

Sascha


----------



## Saskia21 (1. April 2008)

Ja die ist richtig. Es geht jetzt halt nur darum, wie ich diese date korrekt byteweise einlesen kann bzw. byteweise kopieren kann


----------



## zerix (1. April 2008)

Ich mache dir nachher mal ein Beispiel fertig.

MFG

Sascha


----------



## Saskia21 (1. April 2008)

Danke das ist total nett von dir. Also nochmal, dass die Frage klarer wird:
ich habe ein Zip Archiv erstellt.
Dieses ZipArchiv lese ich byteweise in ein byte[] ein.
Durch dieses byte[] will ich ein neues zip Achiv erstellen.
Die beiden Archive sollen vom Aufbau und Inhalt identisch sein, nur der Speicherort und ggf. die Namen sind unterschiedlich.


----------



## zerix (2. April 2008)

Also ich hab kein Archiv erstellt, sondern ein vorhandenes genommen.


```
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;


public class ZipByteExample
{

  public static void main(String[] args) throws Exception
  {
    File zipFile = new File("I:/src.zip");
    
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    FileInputStream fis = new FileInputStream(zipFile);
    
    int i = 0;
    while((i=fis.read())!= -1){
      bos.write(i);
    }
    fis.close();
    bos.close();
    byte[] zipFileBytes = bos.toByteArray();
    
    FileOutputStream fos = new FileOutputStream("I:/teste.zip");
    fos.write(zipFileBytes);
    fos.flush();
    fos.close();
    
  }
  
}
```

Warum möchtest du es aber als ByteArray einlesen, hat das einen bestimmten Grund?

MFG

Sascha


----------



## Saskia21 (2. April 2008)

Ja, es werden Daten vom Server zum Client durch Webservice gesendet. Und diese Dateien übergebe ich byteweise. Hätte das auch mit soap attachment machen können, aber das hat mir immer fehler geschmießen....
Deshalb hatte man mir geraten das so zu machen.

LG


----------



## zeja (2. April 2008)

@Sascha: Warum postest du nochmal das was schon dasteht? 

@Saskia: Ich nehme mal an dass deine Methode alles packt was in deinem Verzeichnis liegt, also neben deinen XML-Datei auch alte zip-Dateien die da noch rumliegen. Kann das sein?


----------



## Saskia21 (2. April 2008)

habe nur versucht auf die Frage antworten:
Warum möchtest du es aber als ByteArray einlesen, hat das einen bestimmten Grund?


----------



## zerix (2. April 2008)

@zeja
Ich wollte nur was posten, wo ich sicher bin, dass es funktioniert. 
Ich glaube nicht, dass es alte ZipDateien sind, sondern die aktuelle, die gerade erstellt wird. 
Das würde auch erklären, warum das ZIP-Archiv im ZIP-Archiv nicht funktioniert.

MFG

Sascha


----------

