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

  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

  7. #7
    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
    Si le fichier que tu dois lire est une classe java, je m'étonne que tu mettes son contenu dans un String ; tu devrais le mettre dans un tableau de bytes.

    Mais est-ce que tu lis un fichier class ou un fichier texte ?

  8. #8
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Salut,

    alors deja pour des questions de performances quand tu lis un fichier (quel qu'il soit) c'est jamais tres efficace de le lire byte par byte, utilise plutot un tableau de byte, ca accelerera grandement ton programme.

    Ensuite un fichier .class n'est pas un fichier texte (ASCII) mais un fichier binaire, lorsque tu fais "contenu + c", c est interprete en tant que caractere mais rien ne dit que c'est un caractere, ca peut etre une valeur < 128, donc non visible en ASCII, d'ou une String differente du contenu reel du fichier.

    Je pense que ton probleme vient surtout de la!

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  9. #9
    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... Je crois que je vais pas y arriver... x_x

    Help !! J'arrive pas à m'exprimer !!

    J'ai un fichier Toto.class et j'utilise une fonction de lecture de fichier... Quelque soit la méthode, j'obtiens le bon nombre de caratère. A savoir, dans l'exemple que j'ai donné, 1499.

    Si je le met dans un jar, le programme que j'ai fourni lit quelque chose que je n'arrive pas à identifier

    En fait, je le répéte, l'objectif final est de lire un fichier dans une archive. Quelle soit jar ou zip...

    Pour bien comprendre le problème, je vous invite à essayer mon programme

    En tout cas, merci pour votre aide

  10. #10
    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
    Et bien zip ou jar c'est la même chose : les fichiers binaires doivent être lus en mode binaire, les fichiers textes en mode texte, sinon ça fonctionne pas. (Les fichiers textes, c'est vrai, pourraient être lus en mode binaire). (mais c'est pas le but en général).

    Tu peux regarder ici des exemples de manipulation de jar en java, et des exemples de zip ou gzip. Si tu trouves un fichier binaire placé dans un texte, et que ça marche, tu me le dis. Et je pense que tu peux t'inspirer de ces exemples pour la lecture de ton fichier.

  11. #11
    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
    Oki merci pour les exemples ^^

    Je regarde ca et je te dis

    PS : Désolé Bulbo, c'est effectivement ce que tu avais dit... J'avais pas compris ta remarque en fait Ca m'ouvre une nouvelle voie pour mes tests

Discussions similaires

  1. Lire le contenu d'un fichier PDF
    Par skywaukers dans le forum Delphi
    Réponses: 6
    Dernier message: 18/07/2006, 13h01
  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, 09h17
  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, 19h47
  4. lire le contenu d'un fichier
    Par rootdaoud dans le forum Langage
    Réponses: 19
    Dernier message: 01/09/2005, 18h39
  5. [Fichier] Lire le contenu d'un fichier
    Par bart64 dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 19/09/2004, 19h18

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