File zippen

Status
Nicht offen für weitere Antworten.

sooks

Mitglied
Ich will ein File zippen, bevor ich es auf die Festplatte schreibe. Leider ist das gezippte File dann grösser als die normale datei ???:L , und das zip-Archiv ist auch ungültig.

Hier der Teil, wo gezippt werden soll:

Code:
      import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.zip.*;

public class FileExp extends JFrame
                     implements ActionListener

{ JButton load;
  JButton create;
  JButton delete;
  JButton zip;

  JFileChooser lade;
  JFileChooser erstelle;
  JFileChooser zippen;

  JTextArea edit;

  JTextField datei;

  String name;
  String zipname;

  public FileExp()

  { Container c = getContentPane();

    load = new JButton("Laden von...");
    create = new JButton("Speichern in...");
    delete = new JButton("Datei löschen");
    zip = new JButton("Zippen in...");

    datei = new JTextField("");
    datei.setEditable(false);

    edit = new JTextArea("");
    edit.add(new JScrollPane());
    edit.setEditable(true);

    JPanel buttons = new JPanel();

    c.setLayout(new BorderLayout());
    buttons.setLayout(new GridLayout(1,4));

    c.add(edit, BorderLayout.CENTER);
    c.add(buttons, BorderLayout.SOUTH);
    c.add(datei, BorderLayout.NORTH);

    buttons.add(load);
    buttons.add(create);
    buttons.add(delete);
    buttons.add(zip);

    delete.setBorder(BorderFactory.createEtchedBorder());
    load.setBorder(BorderFactory.createEtchedBorder());
    create.setBorder(BorderFactory.createEtchedBorder());
    edit.setBorder(BorderFactory.createEtchedBorder());
    datei.setBorder(BorderFactory.createEtchedBorder());
    zip.setBorder(BorderFactory.createEtchedBorder());

    load.addActionListener(this);
    delete.addActionListener(this);
    create.addActionListener(this);
    zip.addActionListener(this);
  }

  public void actionPerformed(ActionEvent event)

  { try

    { if(create == event.getSource())

      { erstelle = new JFileChooser();

        int returnVal = erstelle.showSaveDialog(erstelle);

        if (returnVal == JFileChooser.APPROVE_OPTION)
        { name = erstelle.getSelectedFile().getPath();
          datei.setText(name);
          new File(name).createNewFile();

          String s;
          while ((s = edit.getText()) == null);
          FileOutputStream fos = new FileOutputStream(name);
          fos.write( s.getBytes() );
          fos.close();
	    }

	    erstelle.setVisible(true);
      }

      if(load == event.getSource())

      { lade = new JFileChooser();

        int returnVal = lade.showOpenDialog(lade);

        if (returnVal == JFileChooser.APPROVE_OPTION)
        { name = lade.getSelectedFile().getPath();
          datei.setText(name);

          byte buffer[] = new byte[4000];
          FileInputStream fis;
		  fis = new FileInputStream(name);
		  int len = fis.read(buffer, 0, 4000);
		  String str = new String(buffer, 0, len);
          edit.setText(str);
          fis.close();
	    }

	    lade.setVisible(true);
      }

      if(zip == event.getSource())

      { zippen = new JFileChooser();

        int returnVal = zippen.showSaveDialog(zippen);

        if (returnVal == JFileChooser.APPROVE_OPTION)
        { zipname = zippen.getSelectedFile().getPath();

	      FileInputStream is = new FileInputStream(name);

	      ZipOutputStream os = new ZipOutputStream(new FileOutputStream(zipname));

	      byte[] buffer=new byte[1000];
	      int len;

	      os.setLevel(0);

	      ZipEntry ze;

	      ze=new ZipEntry(zipname);
	      os.putNextEntry(ze);
	      while(0<(len=is.read(buffer)))
	        os.write(buffer,0,len);
	      os.closeEntry();
	      os.flush();
	      os.close();
          is.close();
	    }
      }

      if(delete == event.getSource())

      { new File(name).delete();
        System.out.println(name);
        edit.setText("");
      }
    }

    catch(IOException e)
    { System.out.println("Fehler!");
	}
  }

  public static void main(String[] args)

  { JFrame start = new FileExp();
    start.setSize(800,600);
    start.setLocationRelativeTo(null);
    start.setVisible(true);
  }
}

mfg sooks
 

thE_29

Top Contributor
Probier mal das Level auf 0 zu setzen ;)

Aber normalerweise sollte es net größer sein!

Nachtrag: bei mir geht das ganze gar net, bekomme ne java.lang.IndexOutOfBoundsException

auf Zeile os.write(buffer, 0, len);
 

thE_29

Top Contributor
ASDF!!!

Tust du den Strichpunkt hinterm while weg!!


while(0<(len=is.read(buffer))); <----- dh, er macht nix das ganze File lang!!
os.write(buffer,0,len);


außerdem kannst du den Buffer größer wählen!


Nachtrag2: also bei mir wirds kleiner!

jpeg zwar nur um 2 KB (war 28.7 => 28.5)

aber pdf von 7.7 MB auf 5.8 MB!
 

sooks

Mitglied
; nach while ist weg, danke, aber bei mir wird da nur der Verzeichnisbaum angezeigt, wo die Datei drinsteht, aber die datei selbst wird nicht gezippt...

Hab mal den ganzen Code reingestellt, wenn ihr es testen wollt...

mfg sooks
 

thE_29

Top Contributor
Code:
      if(zip == event.getSource())

      { zippen = new JFileChooser();

        int returnVal = zippen.showSaveDialog(zippen);

        if (returnVal == JFileChooser.APPROVE_OPTION)
        { zipname = zippen.getSelectedFile().getPath();

         FileInputStream is = new FileInputStream(name);

         ZipOutputStream os = new ZipOutputStream(new FileOutputStream(zipname));

         byte[] buffer=new byte[1000];
         int len;

         os.setLevel(9); //<- level 9 = beste speicherung

         ZipEntry ze;

         ze=new ZipEntry(name);      //das da war falsche <---- du musst die Datei schon wieder so benennen, so wie der Name vorher war!
         os.putNextEntry(ze);
         while(0<(len=is.read(buffer)))
         {
             System.out.println(new String(buffer,0,len));  
             os.write(buffer,0,len);
         }
         os.flush();
         os.closeEntry();
         os.close();
          is.close();
       }
      }



Achja und lass dir die Exceptions Meldungen ausgeben!!!
 

niemand

Bekanntes Mitglied
DP hat gesagt.:
andere frage: kann man irgendwo den kompressionsgrad einstellen?!
http://java.sun.com/j2se/1.5.0/docs/api/java/util/zip/ZipOutputStream.html#setLevel(int)

So eine schöne Doku, die Sun da gebaut hat ...

cu
 

Illuvatar

Top Contributor
Ich hab da auch mal eine Methode geschrieben:
Code:
	public void deepZip (File zip, File... fils)
	{
		try {
	    	ZipOutputStream zos = new ZipOutputStream (new FileOutputStream(zip));
			zos.setMethod(ZipOutputStream.DEFLATED);
			zos.setLevel(9);
			for (File fil : fils){
				deepZipRec (zos, fil, new Vector<String>());
			}
			zos.close();
	    }catch (IOException ex) {
	    	ex.printStackTrace();
	    }
	}
	private void deepZipRec (ZipOutputStream zos, File zip, Vector<String> parentDirs) throws IOException
	{
		if (zip.isDirectory()){
			Vector<String> newParents = new Vector<String>(parentDirs);
			newParents.add(zip.getName());
			for (File fil : zip.listFiles()){
				deepZipRec (zos, fil, newParents);
			}
		}else{
			StringBuffer sb = new StringBuffer();
			for (String s : parentDirs){
				sb.append(s + "/");
			}
			ZipEntry entry = new ZipEntry (sb.toString() + zip.getName());
			entry.setSize(zip.length());
			entry.setTime(zip.lastModified());
			zos.putNextEntry(entry);
			FileInputStream fis = new FileInputStream (zip);
			int len;
			byte[] buf = new byte[1024];
			while ((len = fis.read(buf)) > -1){
				zos.write(buf, 0, len);
			}
			fis.close();
			zos.closeEntry();
		}
	}
Vielleicht hilft dir das auch was.
 

DP

Top Contributor
das mit dem setlevel ist ja schön und gut.

aber:

verzeichnis = 695mb
level 0 - zipfile = 750mb
level 1 - zipfile = 156mb
level 9 - zipfile = 156mb

wenn ich das mit dem winrar mit normalem kompressionsgrad komprimiere, komme ich auf knapp 98mb.

so der brüller ist das dann doch nicht... :(
 

thE_29

Top Contributor
Das ist klar :)


das hat Sun nur so als Gimmick dazugemacht und net als Ersatz für Zip Programme. :)

Wahrscheinlich mit einem OpenSource Zip verfahren oder ein billig entwickeltes/lizenziertes Verfahren!

Winzip/Rar/ace/tar/gzip sind ja darauf spezialisiert Daten klein zu kriegen und nicht eine Programmiersprache zu schreiben ;)


@Threaderöffner: Ich habe komplett 1:1 deinen Soure genommen und einfach den 1en Namen geändert und es hat funktioniert!

Wenns dann immer noch nicht geht (bei dir) dann musst du was anderes falsch machen!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Jar-File Start nur über Terminal Allgemeine Java-Themen 13
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
D Read JSON File Problem Allgemeine Java-Themen 9
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
C jar File mehrfach aufrufen (als Windows Dienst) Allgemeine Java-Themen 5
N File Path mit Variablen angeben Allgemeine Java-Themen 1
izoards Zugriff auf gemeinsame Ressource (CSV-File) Allgemeine Java-Themen 3
S Class File Editor -> Source not found Allgemeine Java-Themen 4
F jar File ausführen Allgemeine Java-Themen 14
M File Binary Representation Allgemeine Java-Themen 1
N jar File auf Mac mit Doppelklick starten Allgemeine Java-Themen 5
O Input/Output java.io.File beenden Allgemeine Java-Themen 5
G File not found - nach dem Kompilieren Allgemeine Java-Themen 6
T Jar File zu exe... Allgemeine Java-Themen 3
M Foreign Memory API / Memory-Mapped File Allgemeine Java-Themen 0
R Delete files before creating new from temp using Java file method Allgemeine Java-Themen 1
S File lesen und schreiben Java 6 Allgemeine Java-Themen 2
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
F Input/Output FileNotFoundException, obwohl File existiert Allgemeine Java-Themen 5
G Excel File öffnen, in Zelle schreiben, abspeichern Allgemeine Java-Themen 6
L JAR-File auf Ilias (LMS) laufen lassen Allgemeine Java-Themen 0
ralfb1105 Classpath Directory fuer Properties File Allgemeine Java-Themen 2
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
J File in Package erstellen & lesen mit Programmstart in externe Projekt Allgemeine Java-Themen 3
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
A File lesen Codierung Charset Allgemeine Java-Themen 5
J .java-Dateitext Compile zur Laufzeit ohne File Allgemeine Java-Themen 15
M Key-File im selben Ordner speichern? Allgemeine Java-Themen 18
I TrueZip add file to archive Allgemeine Java-Themen 10
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
J ftp - delete file ohne appache Allgemeine Java-Themen 8
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
T ImageIO.read -> Can`t read input file Allgemeine Java-Themen 11
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
C Swing File[] als klickbare links in irgendeinem Swing Element Allgemeine Java-Themen 3
H Kennt sich jemand mit Eclipse und dem Thema Jar-File aus ? Allgemeine Java-Themen 6
H Laden einer (Resourcendatei) aus einem Jar-File Allgemeine Java-Themen 17
C Authentifizierung mit java.nio.file? Allgemeine Java-Themen 5
L CSV File lesen, in ArrayList speichern und ausgeben Allgemeine Java-Themen 3
M xlsx File auslesen Exception occured Allgemeine Java-Themen 13
offi Drag and Drop mehrerer File aus Explorer in JTable Allgemeine Java-Themen 1
G Java/LibGDX File Loading Exception Allgemeine Java-Themen 2
Cromewell JavaFX FXML-File lädt unter Ubuntu nicht Allgemeine Java-Themen 7
D Java Anwendung mit dll File Allgemeine Java-Themen 5
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
thet1983 Input/Output read properties file from classpath Allgemeine Java-Themen 3
J Umwandeln von URL zu File und danach kopieren geht nicht Allgemeine Java-Themen 1
J Properties file ändern Allgemeine Java-Themen 12
S Executable Jar File startet nicht unter Windows 10 Allgemeine Java-Themen 3
B Objekte anhand von Properties file Allgemeine Java-Themen 41
Dechasa Input/Output Write into File Allgemeine Java-Themen 2
N Maven ObjectMapper Error wenn das File gespeichert wird Allgemeine Java-Themen 0
H Security Manager (IIOException: Can't read input file!) Allgemeine Java-Themen 2
H File.listFiles() funktioniert nicht... Allgemeine Java-Themen 10
C Input/Output Problem bei Datei verschiebung mit File.move und Paths.get() Allgemeine Java-Themen 26
X Zeile unter einer bestimmen Zeile hinzufügen(File) Allgemeine Java-Themen 1
F Open source file übersetzen Phython -> Java Allgemeine Java-Themen 4
C file.delete() funktioniert bei zweiten aufruf nicht mehr Allgemeine Java-Themen 3
M Desktop jar File icon Ändern? Allgemeine Java-Themen 14
O Sax-Parser ließt XML-File doppelt Allgemeine Java-Themen 1
J Java Software Compare Files und Neue File erstellen Allgemeine Java-Themen 0
Thallius Custom File Chooser Allgemeine Java-Themen 1
C .jar File lässt sich nur über Konsole öffnen Allgemeine Java-Themen 1
J Java Download Filedownload File.getFileName Allgemeine Java-Themen 3
R Java .class-File-Konstrunkt mit Programm visualisieren Allgemeine Java-Themen 18
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
M pdf File bzw. ausgefüllte pdf Formulare drucken Allgemeine Java-Themen 2
S Input/Output File Not Found FileReader Allgemeine Java-Themen 6
Thallius Serialisiertes File kann auf anderem Rechner nicht geladen werden Allgemeine Java-Themen 12
P Java Dynamic Web Project -> config File Allgemeine Java-Themen 1
S runnable jar file in Verbindung mit itext Allgemeine Java-Themen 3
D Variablen java.io.File zum vergleichen abspeichern Allgemeine Java-Themen 1
M File IO Klasse ... wie einbinden Allgemeine Java-Themen 6
O Freies Tool zum Jar-File obfuscaten gesucht! Allgemeine Java-Themen 5
F File.listFiles ohne .sort Allgemeine Java-Themen 6
B XML File JAXB Allgemeine Java-Themen 0
S Platzverbrauch, File oder String Allgemeine Java-Themen 14
J Runnable jar-File: Fehlermeldung Allgemeine Java-Themen 2
P Kurze Frage: aus einer File die Zeilenanzahl auslesen Allgemeine Java-Themen 9
K Gepacktes Jar-File gibt beim Doppelklick eine Exception aus Allgemeine Java-Themen 4
P java.nio.file unter Java 6 verwenden Allgemeine Java-Themen 4
A TXT File einlesen unterschiedliche Zeilenlänge Allgemeine Java-Themen 9
B Finde letztes veränderte File Allgemeine Java-Themen 4
E Zip-File entpacken: unterschiedlicher Zeitaufwand bei unterschiedlicher Puffergröße Allgemeine Java-Themen 2
Guybrush Threepwood File.canWrite() und UAC Allgemeine Java-Themen 7
N Input/Output Mit Windows 7 erzeugtes zip-File in Java 7 öffnen Allgemeine Java-Themen 5
B Garbage Collection Logfile: Binary File Allgemeine Java-Themen 2
H XML-File mit Java erzeugt Frage Allgemeine Java-Themen 10
V C-Header Datei aus .java File herstellen Allgemeine Java-Themen 10
D File mit Inhalt kopieren und dieses File dann neu erstellen ? Allgemeine Java-Themen 4
T @NotBlank verwendet nicht message aus .property-File Allgemeine Java-Themen 4
G Jar-File soll eignen *.jar Namen ausgeben Allgemeine Java-Themen 10
S Jar-File startet nicht über doppelklick Allgemeine Java-Themen 2
P ganze Zeilen in einem File mit .replace() ändern. Allgemeine Java-Themen 10
S Datei in File-Objekt mit UTF-8 einlesen Allgemeine Java-Themen 2
P Aus einem File Zeilen auslesen. Allgemeine Java-Themen 15
V ProcessBuilder exe file Allgemeine Java-Themen 3
L Variablen IO Exception weil File angeblich nicht exisitert Allgemeine Java-Themen 10
M File einlesen während es beschrieben wird.. Allgemeine Java-Themen 6
B File umbennen ohne Extension zu aendern Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben