Input/Output Property-Datei aus einer Zip lesen in in einer anderen Zip-Datei ist

euko

Neues Mitglied
Hallo,

sorry für die Anfängerfrage, aber habe keine Antwort bisher gefunden:

Ich muss eine Property-Datei lesen die in einer Zip-Datei gespeichert ist. Die Zip ist wiederum in einer weiteren Zip-Datei enthalten.

Im unteren Code habe ich mich bereits zur inneren Zip vorgearbeitet und finde auch die Property-Datei darin - kann aber die werte noch nicht lesen.

Das Lesen der Property werte funktioniert bisher nur, wenn die Property Datei in der eußeren Zip liegt. :bahnhof:

Java:
public void readPropertyFileFromArchive(String zipFilePath)
	{
		ZipFile zipFile = null;
		try{
		
			zipFile = new ZipFile(zipFilePath);
			Enumeration<? extends ZipEntry> zipEntries = zipFile.entries();
			
			// ZIP Datei durchsuchen
			while(zipEntries.hasMoreElements())
			{
				ZipEntry zipEntry = zipEntries.nextElement();
				
				String lowerCaseName = zipEntry.getName().toLowerCase();
				if (lowerCaseName.contains( configHMap.get("PropertyFile").toLowerCase() ))
				{
				// Properties gefundener Datei einlesen
					InputStream is = zipFile.getInputStream(zipEntry);
					Properties properties = new Properties();
					properties.load(is);
	
					for (String key : properties.stringPropertyNames()) 
					{
						String value = properties.getProperty(key);
						this.propHMap.put(key, value);
					}
				}
	
				
				
		// Durchsucht ein gefundenes Archiv im aktuellem Archiv //		
				if( lowerCaseName.endsWith(".ear") || lowerCaseName.endsWith(".war") || lowerCaseName.endsWith(".jar") )
				{
					//readInnerZipFile(zipFile, zipEntry.getName());
					InputStream innerZipStream = zipFile.getInputStream(zipEntry);

					
					
			//>>>> new innerZipFile
					ZipInputStream zis = new ZipInputStream(innerZipStream);
					
					ZipEntry entry = zis.getNextEntry();
					while (entry != null ) {
					    
					    lowerCaseName = entry.getName().toLowerCase();
						if (lowerCaseName.contains( configHMap.get("PropertyFile").toLowerCase() ))
						{
						// Properties gefundener Datei einlesen
							
		
//////>>>>> folgend ist der fehler:

  InputStream is =  zis.getInputStream(entry);
//////>>>>> 
							Properties properties = new Properties();
							properties.load(is);
//
							for (String key : properties.stringPropertyNames()) 
							{
								String value = properties.getProperty(key);
								this.propHMap.put(key, value);
										//System.out.println("++ key: "+key +", value:"+properties.getProperty(key));
							}
						}
						
					entry = zis.getNextEntry();
					}
				}
				
				
				
			}
			
		}catch(Exception e){
			
		}finally{
			if (zipFile != null)
				zipFile.close();
		}
	}
 
Hi,
Hier mal ein Beispiel:
Die Datei: config.properties liegt innerhalb von config.zip, welche sich wieder in config_2.zip befindet:
Java:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Properties;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class Test {

    private static String file = "config.properties";
    private static String zipString = "config_2.zip";


    public static void main(String[] args) {    
        readZipFile(zipString);
    }

    private static void readZipFile(String file)  {
        ZipFile zipFile;
        ZipFile innerZip;

        ZipEntry entry;
        ZipEntry entry2;

        InputStream is = null;

        try {
            zipFile = new ZipFile(file);
            Enumeration<? extends ZipEntry> entries = zipFile.entries();

            while(entries.hasMoreElements()) {
                entry = entries.nextElement();    
                if(entry.getName().endsWith("zip")) {                    
                    innerZip = new ZipFile(entry.getName());
                    Enumeration<? extends ZipEntry> entries2 = innerZip.entries();    
                    while(entries2.hasMoreElements()) {
                        entry2 = entries2.nextElement();                        
                        if(entry2.getName().equals("config.properties")) {
                            is = innerZip.getInputStream(entry2);
                            Properties properties = new Properties();
                            properties.load(is);
                            System.out.println(entry2.getName() + " gefunden in " + innerZip.getName() + " innerhalb von: " + zipFile.getName());
                            System.out.println(properties.getProperty("database"));
                            System.out.println(properties.getProperty("dbuser"));
                            System.out.println(properties.getProperty("dbpassword"));
                        }
                    }
                } else if(entry.getName().equals("config.properties")){
                    is = zipFile.getInputStream(entry);
                    Properties properties = new Properties();
                    properties.load(is);
                    System.out.println(entry + " gefunden in " + zipFile.getName());
                    System.out.println(properties.getProperty("database"));
                    System.out.println(properties.getProperty("dbuser"));
                    System.out.println(properties.getProperty("dbpassword"));
                }    
                else {
                    System.out.println("Keine Datei gefunden.....");
                }
            }

        } catch (IOException ex) {
            System.err.println(ex.getMessage());
        }                
        finally {
            if(is != null) {
                try {
                    is.close();
                } catch (IOException ex) {
                    System.err.println(ex.getMessage());
                }
            }
        }
    }
}
Ausgabe:
Code:
config.properties gefunden in config.zip innerhalb von: config_2.zip
localhost
user
password
 
Zuletzt bearbeitet:
innerZip = new ZipFile(entry.getName());

an der Stelle erhalte ich den folgenden fehler:

„earMms.zip (Das System kann die angegebene Datei nicht finden)“


Die äußere zip ist in "C:\tmp\BmoZIP.zip" und darin ist die "earMms.zip"


Habe auch folgendes probiert, wird aber auch nicht gefunden:
innerZip = new ZipFile("C:/tmp/BmoZIP.zip/earMms.zip");



deshalb hatte ich das ursprünglich auch so gemacht, damit die innere zip gelesen wird:
InputStream innerZipStream = zipFile.getInputStream(zipEntry);
 
Zuletzt bearbeitet:
Der Konstruktor ZipFile(String s) erwartet einen Filenamen aus dem Filesystem.
Du rufst es aber mit dem Namen von einem "ZipEntry" Objekt.

Du hast zumindest 2 Möglichkeiten:
  • Du dekomprimierst den Eintrag in ein temporäres File und arbeitest mit dem Filenamen weiter
  • Du liest den Eintrag in ein Bytearray und verwendest die ZipInputStream Klasse um an den Inhalt zu kommen.
 

Zurück
Oben