Zip-Archive mit temporären Files erstellen

K-Man

Bekanntes Mitglied
Hallo zusammen
Ich möchte eine zip-Datei erstellen und diese mit ebenfalls selbst erstellten Dateien füllen. Da man beim Erstellen von Files ja immer Pfade angeben muss, nehm ich temporäre Dateien und lösch diese am Ende der Prozedur. Da alles auf einem Tomcat laufen soll, nehm ich am Ende die delete(), statt deleteOnExit() Methode. Zu Beginn hab ich den Block mit dem BufferedInputStream nicht verwendet. Da hat dann alles geklappt, aber die Dateien im zip-Archive hatten dann keinen Inhalt. Mit dem BufferedInputStream-Block haben die Datein im zip dann ach den Inhalt "aStringX", nur werden sie jetzt nicht mehr gelöscht.
Was muss ich machen, um Dateien zu erstellen und mit Inhalt zu füllen und diese dann in ein neu erstelltes Zip-Archiv zu packen? Am Ende darf nur das zip-Archiv vorhanden sein.

Schon mal vielen Dank und schöne Grüße


Java:
ZipOutputStream zipOut = null;
BufferedInputStream bis = null;
try
{
            zipOut = new ZipOutputStream(new FileOutputStream("test.zip"));
            for (int i = 0; i < 10; i++)
            {
                File temp = File.createTempFile("test" + i, ".txt");
                BufferedWriter out = new BufferedWriter(new FileWriter(temp));
                out.write("aString" + i);
                out.close();

                String fileName = temp.getAbsolutePath();
                bis = new BufferedInputStream(new FileInputStream(fileName));
                int avail = bis.available();
                byte[] buffer = new byte[avail];
                if (avail > 0)
                {
                    bis.read(buffer, 0, avail);
                }

                ZipEntry ze = new ZipEntry(temp.getName());
                zipOut.putNextEntry(ze);
                zipOut.write(buffer, 0, buffer.length);
                zipOut.closeEntry();

                temp.delete();
            }
        }
 
S

SlaterB

Gast
bis.close();
vor dem delete, bzw. gleich in Zeile 21

-----

du kannst auch in einen ByteArray-Stream/ ein byte[] speichern statt auf die Festplatte,
falls nicht gerade MB-weise,
vielleicht gar direkt in den Zip-Stream, die temporären Dateien erscheinend jedenfalls unnötig
 
Zuletzt bearbeitet von einem Moderator:

K-Man

Bekanntes Mitglied
Danke, ist eigentlich ganz logisch und peinlich es nicht selbst gesehen zu haben :D

Hat aber geklappt und jetzt probier ich es einfach mal mit dem direkt in den Stream schreiben.

Danke.
 

K-Man

Bekanntes Mitglied
Eine Frage habe ich jetzt noch. Ich hab das jetzt mit dem ByteArrayOutputStream gemacht und es klappt auch alles wunderbar. Ich hab jetzt auch dem ZipOutputStream nur ein ByteArrayOutputStream zugewiesen. Ka ob das klappt. Jedenfalls muss jetzt nur noch eines geschehen. Das zip muss in einen String umgewandelt werden. Klingt komisch, aber es ist ein Webservice, der eigentlich einen String erwartet und daraus eine Datei erzeugt. Laut Entwickler kann es sich bei dem String auch um ein zip-Archiv handeln. Aber ich weiß jetzt nicht, wo ich da ansetzen soll

Java:
zipOut = new ZipOutputStream(new ByteArrayOutputStream());
            for (int i = 0; i < 10; i++)
            {
                String testStr = "Test" + i;
                ByteArrayInputStream bis = new ByteArrayInputStream(testStr.getBytes());
                int avail = bis.available();
                byte[] buffer = new byte[avail];
                if (avail > 0)
                {
                    bis.read(buffer, 0, avail);
                }
                if (bis != null)
                {
                    bis.close();
                }

                ZipEntry ze = new ZipEntry("Test" + i + ".csv");
                zipOut.putNextEntry(ze);
                zipOut.write(buffer, 0, buffer.length);
                zipOut.closeEntry();
            }
 
Zuletzt bearbeitet:
S

SlaterB

Gast
> testStr.getBytes()
ist relativ gefährlich, da muss nicht das raus kommen, was bei einem String auf Festplatte mit Default-Encoding gespeichert wird,
wobei wiederum auch nicht zwingend gesagt ist, ob jenes richtiger ist,
ich erinnere nur daran da aufzupassen,

falls das Zip auf der Festplatte gespeichert und zu normalen Dateien entpackt werden sollen, dann leistet
> BufferedWriter out = new BufferedWriter(new FileWriter(temp));
durchaus evtl. anderes,
man würde ja auch nicht BufferedOutputStream(FileOutputStream) + write(testStr.getBytes());
zum Speichern verwenden..,

bleibe lieber bei einem Writer, entweder BufferedWriter ganz oben oder darauf verzichten und nur OutputStreamWriter in einen ByteArrayOutputStream leiten um so am Ende ein byte[] mit dem String als Inhalt zu erhalten,

----

egal ob einfach nur testStr.getBytes() oder mit OutputStreamWriter,
in jedem Fall musst du das erhaltene Array nicht erst wieder mit einem ByteArrayInputStream per Schleife einlesen für byte[] buffer,
du kannst das gesamte Array in einem Stück an zipOut.write() übergeben!

edit:
und ja noch die weitere Verkürzung ganz ohne Array:
den OutputStreamWriter direkt in zipOut leiten, falls da nicht close() usw. Probleme macht


------

was du übertragen solltst kann ich persönlich nun wirklich nicht beurteilen,
eine allgemeine Möglichkeit ist
Base64 ? Wikipedia
Base64 ist ein Begriff aus dem Computerbereich und beschreibt ein Verfahren zur Kodierung von 8-Bit-Binärdaten (z. B. ausführbare Programme, ZIP-Dateien) in eine Zeichenfolge, die nur aus lesbaren Codepage-unabhängigen ASCII-Zeichen besteht.
aber dann muss natürlich die Gegenseite davon wissen, damit weiterarbeiten,
vielleicht ist es zufällig so, vielleicht nicht..
 
Zuletzt bearbeitet von einem Moderator:

freez

Top Contributor
Base64 ? Wikipedia

aber dann muss natürlich die Gegenseite davon wissen, damit weiterarbeiten,
vielleicht ist es zufällig so, vielleicht nicht..

Ich hatte ein ähnliches Problem, dass ich die Gegenseite zwar verändern durfte aber die Schnittstelle / das Protokoll nur Texte erwartet und da bietet sich Base64 an. Die Filegröße wird zwar in Base64 um rund ein viertel (oder wars ein Drittel?) größer, aber dafür können Webservices (oder auch andere Textbasierte Services) sauber damit umgehen.
 

K-Man

Bekanntes Mitglied
Ich habe dazu eine generelle Frage. Ist es überhaupt möglich, ein zip in einen Bytecode zu verwandeln, diesen als Inhalt in eine csv-Datei zu schreiben und diese csv dann einfach in zip umzubenennen?
Das Problem ist ja, dass ich nur einen String abliefern kann. Der Entwickler meinte, ich könnte da auch einfach das zip-Archive als String übergeben. Das Probramm erzeugt danach zwar ein csv (mit dem Bytecode als Inhalt), aber man könne dies ja dann wieder in ein zip umwandeln, indem man die Endung ändert.
Hab es aber mit mehreren Varianten probiert, aber die zip lässt sich nicht mehr reproduzieren. Statt "new String(buffer)" hab ich auch schon "new BASE64Encoder().encode(buffer)" probiert, aber beides klappt nicht.

Java:
    public static String fileToString(String file) {
        String result = null;
        DataInputStream in = null;

        try {
            File f = new File(file);
            byte[] buffer = new byte[(int) f.length()];
            in = new DataInputStream(new FileInputStream(f));
            in.readFully(buffer);
            result = new String(buffer);
        } catch (IOException e) {
            throw new RuntimeException("IO problem in fileToString", e);
        } finally {
            try {
                in.close();
            } catch (IOException e) { /* ignore it */
            }
        }
        return result;
    }

Der Entwickler meinte, der String wird direkt als HttpServletResponse verwendet, es findet keine Charsetkonvertierung statt.

Java:
HttpServletResponse response = getResponse( getExportFormat().getMimeType().getMimeId(), filename);
response.getWriter().write(content);
 
S

SlaterB

Gast
bytes direkt in String ist gefährlich, String kennt nur Chars, positive Zahlen zwischen 0 und 65.000, negative bytes werden in positive umgewandelt, gehen also kaputt

was an
> new BASE64Encoder().encode(buffer)
nicht gehen soll musst du schon erklären,
fange die Übertragung bzw. vorher noch die lokalen Tests nicht mit MB an Daten an, sonsten ein Array von 5 Bytes, schön verteilt negativ, 0, positiv,
übertrage das 'als String' auf welchem Wege auch immer, kommt am Ende dasselbe raus?

wenn ja dann auch auch mit den großen Daten bzw. den Netzwerkweg angehen

-----

in Schritten testen, genaue Beispiele, genauen Code, Ergebnisse und Probleme nennen, dann gehts voran,
nicht nur 'klappt nicht'

zu deinem Code ist zu sagen, dass new String(buffer) wie schon früher String.getBytes() extrem gefährlich bis unmöglich ist
 

K-Man

Bekanntes Mitglied
Das erstellen des zip-Archives über Streams geht ja schon. Ich teste die Methoden erstmal lokal. Heißt ich kann zip öffnen und hab alle Dateien so wie sie sein sollen. Jetzt muss nur noch dieses zip in ein String umgeformt werden. Mit "es geht nicht" habe ich gemeint, dass ich ein csv bekomme, aber ich kann es nicht als zip öffnen. Also muss etwas mit mit der Methode "fileToString" nicht passen.
Ich hab dank deiner Hilfe schon herausgefunden, dass viele negative bytes vorkommen. Deswegen sollte nicht "getBytes" oder "new String(byte[])" verwendet werden, oder?

Ich denke bei mir ist schon das Problem, dass ich nicht weiß, wie ich das zip in welcher Art in ein String umwandeln muss, damit ich es später wieder als zip öffnen kann. Wenn ich mit "new String" oder "Base64Encoder" verwende, oder die Datei in ein binary verwandle, dann hab ich 3 komplett verschiedene Varianten, aber keine Ahnung, welche überhaupt zu einem Ergebnis führen kann. Ich versuch ja schon gar nicht erst den Netzwerk weg, sondern einfach File->String, String als Content für csv, csv in zip umbenennen, zip öffnen.

Aber danke für die Hilfe.
 
S

SlaterB

Gast
> Wenn ich mit "new String" oder "Base64Encoder" verwende, oder die Datei in ein binary verwandle,
> dann hab ich 3 komplett verschiedene Varianten, aber keine Ahnung, welche überhaupt zu einem Ergebnis führen kann.

hmm, die dritte Variante verstehe ich nicht ganz, aber da hast du einerseits "new String", zu dem meine Warnung anscheinend angekommen ist und andererseits Base64Encoder, von mir nur Lob + Zitat
Base64 ist ein Begriff aus dem Computerbereich und beschreibt ein Verfahren zur Kodierung von 8-Bit-Binärdaten (z. B. ausführbare Programme, ZIP-Dateien) in eine Zeichenfolge, die nur aus lesbaren Codepage-unabhängigen ASCII-Zeichen besteht.

tja, manchen könnte die Wahl dann leicht fallen, ich sage nichts neues mehr dazu außer dem zwischen den Zeilen hier ;)

wie es nach der Entscheidung weitergeht, welchen Aufbau, welche Fehler usw., ist nach wie vor offen
 

K-Man

Bekanntes Mitglied
Base64 hab ich mir ja schon zu herzen genommen :)

Ich glaube das Problem liegt woanders. Mit Base64 kann ich ein byte[] in ein String umwandeln und wieder zurück und die beiden byte[] sind zu 100% identisch. Nur kann ich damit kein zip abbilden oder ich versteh es falsch.

Heißt es geht wohl erst nur darum, wie ich ein zip in ein String umwandeln kann, sodass ich später den String in eine Datei schreiben kann und diese Datei dann wieder in ein zip umbenenne und dann das ursprüngliche zip erhalte. Die Frage ist ja schon, ob sowas überhaupt möglich ist :/
Auf dem Server findet ja keine Decodierung statt, sondern der String wird einfach als Inhalt in eine Datei geschrieben.

Sorry, wenn ich nerve, aber ich steh da gerade auf dem Schlauch
 
S

SlaterB

Gast
wie gesagt
aber dann muss natürlich die Gegenseite davon wissen, damit weiterarbeiten,
das ist Voraussetzung,
wenn die Serverseite einen String in eine Datei schreibt gibt es keinen Weg auf dieser Welt, das als Zip zu verwenden,
(edit: keinen mir bekannten, theoretisch nutzt ein Text ja auch alle Kombinationen die denkbar sind,
irgendwelche hohen unlesbaren chars sorgen sicher auch die Byte-Kombinationen, die als byte eingelesen negativ wären,
das müsste man Zeichen für Zeichen einzeln testen, wahrscheinlich sogar auf 2 Byte-Kombinationen achten,
hängt auch davon ab, wie der Server den String abspeichert, mit welchen Encoding,

dass es das nicht fertig gibt, oder zumindest nicht mir bekannt, läßt mich vermuten dass es nicht gerade als normal praktikabel angesehen wird, aber 'kein Weg der Welt' kann ich doch nicht mit Überzeugung behaupten)

der übertragene String muss erst ins byte[] dekodiert werden
 
Zuletzt bearbeitet von einem Moderator:

K-Man

Bekanntes Mitglied
Von Serverseite hab ich nur diese Information. Vllt geht es wirklich nicht?

der String wird direkt als HttpServletResponse verwendet, es findet keine Charsetkonvertierung statt.
Java:
HttpServletResponse response = getResponse( getExportFormat().getMimeType().getMimeId(), filename);
response.getWriter().write(content);
 
S

SlaterB

Gast
das ist Code von deinem Senden, oder?
auf deiner Seite kannst du nicht mehr machen als einen String auf geeigneste Weise zu übertragen, fertig,
od der auf der Gegenseite direkt zu einer Datei werden kann ist für mich sehr fraglich, was neues zu sagen ist hier aber nicht

da dein Posting irgendwie nach direkter Antwort klingt, nutze ich den Platz noch für
> Laut Entwickler kann es sich bei dem String auch um ein zip-Archiv handeln.

kannst du mit diesem Menschen darüber reden oder ist das ein Zitat aus einer Doku, kannst du diese ausführlicher posten/ Link?



abgesehen davon bei zukünftigen Postings von dir damit rechnen
dass ich nicht mehr antworte, sofern ich wie hier praktisch nichts neues beitragen kann ;)
 

ssoul26

Bekanntes Mitglied
Zur Erzeugung eines Strings aus einem File versuch mal folgendes:

Java:
   private static String leseDatei(String sPfad) throws IOException {
      //InputStream erzeugen
      FileInputStream Fis = new FileInputStream(new File(sPfad));
      //Datenkanal
      FileChannel Fk = Fis.getChannel();
      //Bytes mappen
      MappedByteBuffer Mbp = Fk.map(FileChannel.MapMode.READ_ONLY, 0, Fk.size());
      //Dekoder verwenden
      Fis.close();
      return Charset.defaultCharset().decode(Mbp).toString();
   }
 

K-Man

Bekanntes Mitglied
@ssoul26:
Das ist es fast. Damit schaut die Datei vom Inhalt her fast wie das original Zip aus. Nur ein paar Zeichen sind noch unterschiedlich, liegt wohl am Charset? Ich teste es jedenfalls lokal. zB macht er noch aus einem › aus dem Original ein �
Aber ich frage mich dennoch noch, ob das überhaupts möglich ist. Wenn ich ein zip in ein txt umbenenne und den Inhalt in eine andere Datei kopiere, dann habe ich ja auch kein zip (oder gehen mit Notepad chars verloren?).

@SlaterB:
Trotzdem vielen Dank. Wahrscheinlich geht es auch nicht. Ich wüsste ja jetzt auch nicht, wie das mit dem zip funktionieren soll, indem man eine Stringrepräsentation eines zips als Inhalt für eine andere Datei verwendet und diese dann als zip weiterverwenden kann.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I TrueZip add file to archive Allgemeine Java-Themen 10
M tar archive verarbeiten ohne zu entpacken Allgemeine Java-Themen 3
W passwortgeschützte archive mit java öffnen Allgemeine Java-Themen 8
M "JOptionPane.showMessageDialog" funktioniert nicht in jar-Archive. Allgemeine Java-Themen 4
pikay .Z Archive entpacken Allgemeine Java-Themen 2
D TAR-Archive herstellen Allgemeine Java-Themen 2
D dlls und jar archive Allgemeine Java-Themen 4
G Zip-Archive auslesen Allgemeine Java-Themen 3
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
R Delete files before creating new from temp using Java file method Allgemeine Java-Themen 1
X Files.walkFileTree zählt nicht richtig Allgemeine Java-Themen 2
L Mehrere .Jar Files aufrufen Allgemeine Java-Themen 9
P Am Application Server - Selbe files aber trotzdem CNF Allgemeine Java-Themen 2
B Maven Zugriff auf files aus einem kompilierten jar Allgemeine Java-Themen 15
S Eigenschaften (hier Verknüpfung) eines Files lesen Allgemeine Java-Themen 2
M *.class Files ausführen Allgemeine Java-Themen 2
F Java moved Files statt sie zu kopieren Allgemeine Java-Themen 12
B Existenz eines Files max 30 sec prüfen Allgemeine Java-Themen 5
C Input/Output Zip Files über Socket senden und empfangen Allgemeine Java-Themen 6
J Java Software Compare Files und Neue File erstellen Allgemeine Java-Themen 0
X Wav-Files abspielen Allgemeine Java-Themen 2
L Zwei Files miteinander vergleichen und Grafisch darstellen Allgemeine Java-Themen 1
W audio files metadaten Allgemeine Java-Themen 2
M Threads Excel files bearbeiten Allgemeine Java-Themen 4
J Wie kann man .txt Files übers Internet verschicken? Allgemeine Java-Themen 53
V Files mit Umlauten ergeben keine Größe Allgemeine Java-Themen 9
M Verschlüsselung von Text und Files durch RSA (Encoding Problem) Allgemeine Java-Themen 7
M wav-files kanäle zusammenfügen + pitchen Allgemeine Java-Themen 6
R Löschen von Files nicht möglich Allgemeine Java-Themen 11
B Files.isDirectory Allgemeine Java-Themen 14
P Ordnerstruktur nach .js-Files durchsuchen Allgemeine Java-Themen 2
L Class Files , Methode .delete() Allgemeine Java-Themen 13
P Files - nach der reihe String reinschreiben Allgemeine Java-Themen 2
J Laden von JAR Files geht ohne ADMIN Rechte sehr langsam Allgemeine Java-Themen 6
A Navigation zu Files innerhalb jar Allgemeine Java-Themen 3
P JAVA Bilder/Videos in Form von Files vergleichen Allgemeine Java-Themen 7
B Eclipse Attache source to own jar-files Allgemeine Java-Themen 2
B Permissions of Folders/Files Allgemeine Java-Themen 6
A External Sort - too many open files Allgemeine Java-Themen 6
E Files Kopieren Allgemeine Java-Themen 8
V Mac: Paketinhalt eins Files öffnen, wie? Allgemeine Java-Themen 3
M Übergabe mehrer Files an selbstprogrammieren Parser Allgemeine Java-Themen 4
reibi Separator in java.util.Properties-Files Allgemeine Java-Themen 3
M Webservices: WSDL Files ohne "Service" Element? Allgemeine Java-Themen 4
ruutaiokwu System.out auf files umlenken in log4j.xml Allgemeine Java-Themen 4
X Log files monitoren Allgemeine Java-Themen 7
reibi Files über Classpath laden Allgemeine Java-Themen 22
S Viele zip-files zu einem kombinieren..? Allgemeine Java-Themen 3
B Öffnen und schließen von Pdf-Files Allgemeine Java-Themen 8
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
R in .jar werden files nicht gefunden!!! Allgemeine Java-Themen 5
N Fehler mit Jar-Files Allgemeine Java-Themen 9
J BufferedImage aus PNG Files haben keinen Type Allgemeine Java-Themen 4
U Properties in Jar Files Allgemeine Java-Themen 3
Developer_X Extract Zip Files with Java Allgemeine Java-Themen 21
N 2 files auf gleichheit vergleichen Allgemeine Java-Themen 5
A Get all Files in Workspace Allgemeine Java-Themen 9
Quaxli Files massenhaft löschen Allgemeine Java-Themen 3
N Versionierung von jar-Files Allgemeine Java-Themen 5
Daniel_L Best Practice zum Löschen von Log-Files? Allgemeine Java-Themen 8
V aus mehreren jar files, ein großes basteln Allgemeine Java-Themen 22
J Too many open files Allgemeine Java-Themen 11
J Eclipse: Einbindung von jar-Files funktioniert nicht Allgemeine Java-Themen 4
O .jar Files - Tools zum generieren Allgemeine Java-Themen 25
A Problem: Mehrere PDF-Files nacheinander Öffnen Allgemeine Java-Themen 12
A jpeg Files mit eigenem Programm öffnen Allgemeine Java-Themen 4
M Embedded Files aus PDF extrahieren Allgemeine Java-Themen 3
J Too many files open Allgemeine Java-Themen 4
M Debuggen von Code in jar-Files? Allgemeine Java-Themen 5
G Sonderzeichen für Files Allgemeine Java-Themen 5
G bestimmte Files suchen Allgemeine Java-Themen 2
reibi Classenpath mit mehreren gleichen jar-Files Allgemeine Java-Themen 7
M Die gleiche Klasse in mehreren JAR files Allgemeine Java-Themen 5
M Probleme mit jar-files Allgemeine Java-Themen 5
G Bearbeiten von Files in einem Thread Allgemeine Java-Themen 4
reibi Klassenpfad für jar-Files Allgemeine Java-Themen 7
J Alte Log Files löschen mit log4j Allgemeine Java-Themen 3
D Files umbenennen mit renameTo() Allgemeine Java-Themen 5
I Pfadangabe zu Files Allgemeine Java-Themen 2
X PowerPoint Files in Java erzeugen Allgemeine Java-Themen 2
sparrow Ant build-files rekursiv aus ant aufrufen Allgemeine Java-Themen 3
K "Too many open files" bei Property List Allgemeine Java-Themen 5
T Mp3 files? Allgemeine Java-Themen 2
I Files einlesen Allgemeine Java-Themen 3
I Diverse Files aus Ordner auslesen Allgemeine Java-Themen 10
mabu Erstellen/Entpacken von Cabinet-Files Allgemeine Java-Themen 12
T Jar-Files und JVM-Cache? Allgemeine Java-Themen 2
P eingebundene *.jar- Files Allgemeine Java-Themen 28
G policy files laden? Allgemeine Java-Themen 8
T Files an das Betriebsystem übergeben such ideen! Allgemeine Java-Themen 3
M auf files des packages zugreifen Allgemeine Java-Themen 2
A Versionierung von Class-Files Allgemeine Java-Themen 10
vogella Korrektur der Filetypenzuordnung für .jar Files unter Window Allgemeine Java-Themen 2
S Files umbennen Allgemeine Java-Themen 4
M laden von Klassen aus jar files Allgemeine Java-Themen 2
R Drag und Drop von externen Files geht nur als Application Allgemeine Java-Themen 2
V Jar Files Auf meinem Handy Allgemeine Java-Themen 7
D Files einlesen (XML Files) Allgemeine Java-Themen 2
N Problem mit jar und ant: kann files nicht lesen! Allgemeine Java-Themen 15

Ähnliche Java Themen

Neue Themen


Oben