in Zip kopieren -- Backup-Programm

Sasku

Mitglied
Moin Leute,

ich bin dabei ein Backup-Programm zu erstellen .. und nun möchte ich Dateien die ich ausgewählt habe und in einer Liste stehen dann jeweils in ein ZIP-File kopieren und beim nächsten Start des Programmes das Zip-File auslesen und die Dateien wieder in der Liste stehen haben ... Problem ist ich werde aus dem was in der Java-Docs steht überhaupt nicht schlau ..

wie erstelle ich nun ein Zip-File mit Java kann Sachen hineinkopieren und dann wieder auslesen was drinnen steht?

Java:
import java.awt.GridLayout;
import java.io.File;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class oFläche extends JFrame {
	
	// Endung t = textfield l = label b = button 
	
	
	static JTextField speicherPfad_t ;
	static JList list;
	static DefaultListModel model;
	static JButton add_b;
	static JButton savepath_b;

	static int index=-1;
	
	public oFläche(){	
		setSize(700, 500);
		getContentPane().setLayout(new GridLayout(1,1));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setTitle("Linked Control Panel");
		setResizable(false);
		
		JPanel content = new JPanel();										// Inhalts Panel
		content.setLayout(null);
		add(content);
		

		
		model = new DefaultListModel();
		
		
		list = new JList(model);											// List in der die Kritischen Dateien angezeigt werden
		list.setBounds(5,50,420,350);
		list.addListSelectionListener(new ItemListe());
		content.add(list);
		

		
		speicherPfad_t = new JTextField();						// Textfeld in dem der Speicherpfad abgebildet wird
		speicherPfad_t.setBounds(5, 10, 420, 30);
		content.add(speicherPfad_t);
		
		add_b = new JButton("Hinzufügen");									// Button zum Hinzufügen des Pfads der Dateien. 
		add_b.setBounds(435, 50, 120,30);
		add_b.addActionListener(new SearchListener(speicherPfad_t));
		content.add(add_b);
		
		savepath_b = new JButton("Speicherpfad");							// Button zum Angeben des Speicherpfades der Liste. 
		savepath_b.setBounds(435, 10, 120,30);
		savepath_b.addActionListener(new SearchListener(speicherPfad_t));
		content.add(savepath_b);
		
		JButton save_b = new JButton("Speichern");							// Button zum Speichern der Liste
		save_b.setBounds(570,10,100,70);
		save_b.addActionListener(null);
		content.add(save_b);
		
		

		JButton cancel_b = new JButton("Entfernen");
		cancel_b.setBounds(435,90,120,30);
		cancel_b.addActionListener(new EntListener());						// Listener zum Entfernen der Items aus der Liste  ListSelectionListener

		content.add(cancel_b);
		
		
		
		setVisible(true);
		
		
	}
	  public String pfadAuswahl(){
	 	   JFileChooser fileChooser = new JFileChooser();
	 	   int result = fileChooser.showOpenDialog(fileChooser);
	 	   if (result == JFileChooser.APPROVE_OPTION) {
	 	   File selectedFile = fileChooser.getSelectedFile();
	 	   return selectedFile.getAbsolutePath();}
	 	  return null;
	  }
}


das ist meine bisherige Oberfläche .. das ganze Kopieren und so soll erst passieren wenn ich auf den Speichern-Button klicke .. hab dafür einen ActionListener geschrieben .... allerdings habe ich hald noch keine Ahnung wie das mit den Zip-Files geht ..



mfg
 
Oder (ich trau mich kaum das vorzuschlagen) google. Der Treffer hier sieht ganz vielversprechend aus:
Java ZIP File Example | Examples Java Code Geeks
Edit: Es ist übrigens nie eine gute Idee, zuerst die Gui zu programmieren und sich erst dann mit der Logik die ausgeführt werden soll, auseinanderzusetzen. Andersrum wird ein Schuh draus: Lerne zuerst, wie das mit den Zipfiles funktioniert, dann stricke dir eine Gui drumherum.
 
Zuletzt bearbeitet:
Oder (ich trau mich kaum das vorzuschlagen) google. Der Treffer hier sieht ganz vielversprechend aus:
Java ZIP File Example | Examples Java Code Geeks
Edit: Es ist übrigens nie eine gute Idee, zuerst die Gui zu programmieren und sich erst dann mit der Logik die ausgeführt werden soll, auseinanderzusetzen. Andersrum wird ein Schuh draus: Lerne zuerst, wie das mit den Zipfiles funktioniert, dann stricke dir eine Gui drumherum.


jaaa ich weis .. mache diesen "Fehler" allerdings immer wieder ... weis leider nicht warum ..

danke jedenfalls .. .sieht erstmal gut aus .. mal sehen wie ich es verarbeiten kann!
 
Ich habe hier mal was geschrieben, es ist ach nciht so elegant denke ich - eventuell kann Dich die zippen-Methide inspirieren.

Java:
package frageaktuell;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.swing.JFileChooser;

public class Main {

	/**
	 * 
	 * @param pfade das sind die Pfade derzenigen Dateien, die Du in den Zippordner reintun wilst und die ausgesucht hast.
	 * @param zipName Das ist der dateiname des Zipordners, und zwar dessen absoluter Pfad.
	 */
	public void zippen(String[] pfade,String zipName){
		
		 FileInputStream inStream = null;
		 ZipOutputStream outStream = null;
		 ZipEntry ze = null;
		 
		 
	      try{
	    	  
              outStream = new ZipOutputStream(new FileOutputStream(zipName));
              
	      for(String pfad : pfade){
	    	  
              outStream.putNextEntry(new ZipEntry(pfad.substring(pfad.lastIndexOf('\\'))));
              
                                    inStream = new FileInputStream(pfad);
	                                byte[] buffer = new byte[1024];
	                                int bytesRead;
	                                
	                                while ((bytesRead = inStream.read(buffer)) > 0) {
	                                    outStream.write(buffer, 0, bytesRead);
	                                }
	       
	      }
	      
	      outStream.closeEntry();
          
	      }catch(IOException e){
	    	     e.printStackTrace();
	      
          
           }
	       	
		try {
			outStream.close();
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}
	
	//Diesen Auswahldialog habe ich ovn Dir:
    public String pfadAuswahl(){
    JFileChooser fileChooser = new JFileChooser();
    int result = fileChooser.showOpenDialog(fileChooser);
    if (result == JFileChooser.APPROVE_OPTION) {
    File selectedFile = fileChooser.getSelectedFile();
    
    if(selectedFile.isFile()){
    	return selectedFile.getAbsolutePath();	
    } 
    
    
    }

    return null;
    
    }
     
 public static void main(String[] args){
	 
	 Main m = new Main();
     
	//Absoluter Pfad des zu erschaffenden Zpordners, hierher sol gezippt werden.
	 String hierherSollGezipptWerden = "C:\\Users\\ich\\wohne\hier\\gezippt.zip";
	 
	 //Ich setze die Dateien mal in ein kleines Array.
	 String[] dateien = new String[2];
	 dateien[0]=m.pfadAuswahl();
	 dateien[1]=m.pfadAuswahl(); 
	 
	 //... und so stele ich mir die ZipMethode vor:
	 m.zippen(dateien,hierherSollGezipptWerden);

 }

}
 
danke .. mal sehen wiie ich das einbauen kann .. aber eines verstehe ich immernoch nich .. wozu das Byte Array buffer und die while schleife danach sind? kannst du das bitte erklären? 🙂
 
Wegen der Frage mit dem Buffer und der Whileschleife - ich habe diese auskommentiert und festgestellt, dass die Inhalte der Dateien des zu zippenden Ordners ansonsten nicht in diejenigen Dateien geschrieben werden, die dann als Kopien derselben Dateien im gezippten Ordner sich befinden sollen.

Die Readmethode tut folgendes:

Die Einzelnen zu zippenden Dateien werden

public int read(byte[] b)
throws IOException

Reads up to b.length bytes of data from this input stream into an array of bytes. This method blocks until some input is available.

Overrides:
read in class InputStream
Parameters:
b - the buffer into which the data is read.
Returns:
the total number of bytes read into the buffer, or -1 if there is no more data because the end of the file has been reached.
Throws:
IOException - if an I/O error occurs.
See Also:
InputStream.read(byte[], int, int)
(Quelle: Oracle Dokumentation)

Wenn es keine bytes mehr zu lesen gibt, dann wird die Whileschleife beendet, denn dann gibt read(byte[]) -1 zurück. Ansonsten wird byte für byte des Buffers ausgelesen und in den outputStream megabyteweise hineingeschrieben, das ist dann der Kopiervorgang der Dateien, welche aus dem zu zippenden Ordner (oder aus den zu zippenden Ordnern) ausgelesen und in den Zipordner geschrieben werden sollen. Ich hoffe, dass meine Erklärung korrekt war, ich bn auch kein Überflieger 🙂
 
danke habs jetzt auch halbwegs verstanden .. 🙂 funktioniert auf jedenfall super .. 😀

jetzt muss ichs nur noch schaffen mehr als eine Datei gleichzeitig in das ZIP-File zu schreiben .. aber das bekomm ich auch noch hin .. wenn nich schreib ich wieder n neuen thread 😛
 

Zurück
Oben