IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Lire le contenu d'un fichier JAR


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 84
    Par défaut Lire le contenu d'un fichier JAR
    Bonjour à tous,

    J'ai un petit soucis au niveau de la lecture de mes fichiers JAR... En effet, j'ai une fonction qui prend en argument un fichier JAR et le nom d'une classe et cette fonction doit renvoyer le contenu de la classe. Seulement je n'arrive pas à lire mon fichier JAR.

    J'arrive à lister le contenu du JAR et donc à trouver que la classe existe bien dans le JAR passer en argument... Mais la lecture du code est un échec. Ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    private String readJarFile(String JarFile, String name) {
     
    try {
    	//Je recherche ma classe dans le fichier JAR
    	JarFile jf = new JarFile(jarFile);
    	Enumeration e = jf.entries();
    	int i = 0;
    	JarEntry je = null;
    	for(i=0;e.hasMoreElements() && i<1000;i++) {
    		je = (JarEntry)e.nextElement();
    		if(je.toString().replaceAll("/",".").replace(".class","").equals(name)) {
    			i = 1001;
    		}
    	}
    	// Je commence à lire le contenu, c'est là où j'ai un problème...
    	InputStream is = jf.getInputStream(je);
    	JarInputStream jis = new JarInputStream(is);
    	Byte lu = 0;
    	String contenu = "";
    	char c = ' ';
    	i = 0;
    	while((lu=(byte)jis.read()) != -1) {
    		c = (char)(int)lu;
    		System.out.println(lu);
    		contenu += c;
    		i++;
    	}
    	System.out.println("JE-FILE : "+je.getCompressedSize() );
    	System.out.println("CONTENU : "+i);
    	return contenu;
    }
    catch(Exception e) {
    	log.fatal(e);
    }
    return null;
     
    }
    Si quelqu'un connait la réponse, qu'il n'hésite surtout pas ^^

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Pourrais-tu nous aider ?... Tu dis que tu as un problème, et tu nous dis où, mais pas lequel ? (je soupçonne que c'est un problème de compilation).

    Si c'est bien la compil, donne nous le message d'erreur ; si c'est à l'exécution, donne nous le stacktrace de l'exception ; s'il n'y a pas d'exception... modifie ton code pour qu'il y en ait une.

    De plus en présentant le code, c'est plus facile à lire si tu utilises la balise code que la balise citation, car la balise code fait la coloration syntaxique, dont on ne peut plus se passer maintenant.

    Et puis, par curiosité, comment vas-tu exploiter ensuite cette lecture de la classe ??

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 84
    Par défaut
    Ah oui t'as raison c'est plus joli

    Désolé je suis un gros noob ^^ Merci pour l'indication

    Alors pour préciser mon problème :

    1- Si je veux accéder à des classes dans mon Programmes Java, c'est pour saturer la fonctions ClassLoader qui permet de charger les classes. J'ai déja réussi à saturer cette classes en chargeant des fichiers *.class ( ClassLoader.loadClass ). L'étape suivante est de récupérer des classes contenu dans un fichier Jar afin de loader toutes les classes d'une librairies Jar

    2- Mon programme à un soucis car je n'arrive pas à lire la classe contenu dans un Jar à l'aide de mon bout de code. Ca lit quelque chose mais je ne sais pas quoi. Il y a quelques erreurs dans mon programme d'ailleurs... (String name en paramètre)

    Je ne comprend pas ce qui ne marche pas

    Si tu veux d'autres précisions....

    PS : Très joli la photo ^^

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Citation Envoyé par Mike Reason
    Ah oui t'as raison c'est plus joli
    N'est-ce pas ?

    Citation Envoyé par Mike Reason
    1- Si je veux accéder à des classes dans mon Programmes Java, c'est pour saturer la fonctions ClassLoader qui permet de charger les classes. J'ai déja réussi à saturer cette classes en chargeant des fichiers *.class ( ClassLoader.loadClass ). L'étape suivante est de récupérer des classes contenu dans un fichier Jar afin de loader toutes les classes d'une librairies Jar
    Mais que veut dire saturer une fonction ??
    Citation Envoyé par Mike Reason
    2- Mon programme à un soucis car je n'arrive pas à lire la classe contenu dans un Jar à l'aide de mon bout de code. Ca lit quelque chose mais je ne sais pas quoi. Il y a quelques erreurs dans mon programme d'ailleurs... (String name en paramètre)

    Je ne comprend pas ce qui ne marche pas
    Premièrement, est-ce que ce programme compile sans erreur ? Je suis très surpris par l'expression (lu=(byte)jis.read()) != -1). Il est vrai qu'elle est si compliquée qu'il se peut qu'elle soit correcte, d'un point de vue syntaxique, quand même. Vérifie qu'elle est bonne aussi du point de vue sémantique

    Ensuite, quand on ne sait pas ce qui ne marche pas, un bon truc est la programmation défensive. Tu places dans ton code des instructions qui vérifient que ce qui est fait est valide. Si ce n'est pas le cas, tu lances une exception.

    Donc essaie de voir ce que tu attends de tes instructions, et voie comment tu pourrais le vérifier.

  5. #5
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Moi, ce que j'ai du mal à cerner, c'est ton besoin...

    Lorsque tu disposes d'un fichier jar qui contient différentes classes java, tu n'as besoin d'aucun code complexe pour charger celles-ci. Tu places le jar dans ton classPath: lorsque tu as besoin d'accéder à une classe/méthode de ce jar, elle est disponible.

    Pourquoi as-tu donc besoin de passer par un ClassLoader explicite?.......
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 84
    Par défaut
    Bon ok... Je vais essayer d'être plus clair

    Déja il faut oublié ce que j'ai dit à propos du ClassLoader, cela est le besoin final et je n'ai aucun soucis avec

    Ce que je veux faire : Lire un fichier dans une archive compressée.

    Cette archive en l'occurance est un fichier .jar.

    Le bout de code que j'ai fourni est censé (il me semble) lire un fichier dans une archive compressée. Le mieux pour bien comprendre ce que je veux faire est de l'exécuter. Voila un bout de code qui marche directement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    package utils;
     
    import java.io.InputStream;
    import java.util.Enumeration;
    import java.util.jar.JarEntry;
    import java.util.jar.JarFile;
     
    import org.apache.log4j.Logger;
     
    public class ReadClass {
     
    	public static void main(String[] args) {
    		readJarFile("/home/Mike/oracle.jar", "oracle.core.lmx.CoreException");
    	}
     
    	public static String readJarFile(String fichier, String name) {
    		Logger log = Logger.getLogger("jarfile");
    		try {
    			//Je recherche ma classe dans le fichier JAR
    			JarFile jf = new JarFile(fichier);
    			Enumeration e = jf.entries();
    			int i = 0;
    			JarEntry je = null;
    			for(i=0;e.hasMoreElements() && i<1000;i++) {
    				je = (JarEntry)e.nextElement();
    				if(je.toString().replaceAll("/",".").replace(".class","").equals(name)) {
    					i = 1001;
    				}
    			}
    			// Je commence à lire le contenu, c'est là où j'ai un problème...
    			InputStream is = jf.getInputStream(je);
    			Byte lu = 0;
    			String contenu = "";
    			char c = ' ';
    			i = 0;
    			while((lu=(byte)is.read()) != -1) {
    				c = (char)(int)lu;
    				contenu += c;
    				i++;
    			}
    			System.out.println("JE-FILE : "+je.getCompressedSize() );
    			System.out.println("CONTENU : "+i);
    			return contenu;
    		}
    		catch(Exception e) {
    			log.fatal(e);
    		}
    		return null;
    	}
     
    }
    Il faut évidemment que la librairie oracle.jar soit dans le répertoire /home/Mike/. Bon très bien, et vous allez me dire où est le problème alors ?

    Le problème est que ce que je lie n'est pas ce que je devrais avroir. Comment je le sais ? Et bien, j'affiche ce que j'ai lu (JE-FILE : 840) et j'affiche la longueur du fichier class (CONTENU : 1499). Quand je décompresse l'archive jar, il est vrai que la longueur du fichier class décompressé que l'on veut lire (/home/Mike/oracle/oracle/core/lmx/CoreException.class) est 1499...

    J'espère avoir été plus clair... C'est pas facile à expliquer quand on a un programme qui n'a pas d'erreur de compilation mais une erreur de résultat (ou c'est peut être moi qui suis nul...).

    En tout cas, merci pour votre patience et vos réponses

Discussions similaires

  1. Lire le contenu d'un fichier PDF
    Par skywaukers dans le forum Delphi
    Réponses: 6
    Dernier message: 18/07/2006, 12h01
  2. Comment lire le contenu d'un fichier ?
    Par AsmCode dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 24/11/2005, 08h17
  3. [FPDF] Lire le contenu d'un fichier PDF, possible ?
    Par Mister Nono dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 06/11/2005, 18h47
  4. lire le contenu d'un fichier
    Par rootdaoud dans le forum Langage
    Réponses: 19
    Dernier message: 01/09/2005, 17h39
  5. [Fichier] Lire le contenu d'un fichier
    Par bart64 dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 19/09/2004, 18h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo