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 :

Changer une ligne d´un fichier sans devoir reecrire des lignes cryptees


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Points : 21
    Points
    21
    Par défaut Changer une ligne d´un fichier sans devoir reecrire des lignes cryptees
    Bonjour ,

    J´ai un probleme technique a resoudre et je ne m´en sors pas!! J´ai des fichiers INI qui pernettent de configurer des applications . Ces fichiers INI ont plus ou moins cette syntaxe :

    [Database]
    DBMS = XX
    servername = XX
    logon type = XX
    DbParm = XX

    [logon]
    SecureUser =*XX
    SecurePassword =*XX

    [Mode]
    mode = XX
    ShowLanguage = XX

    J´ai une appli java qui permet de configurer a l´aide d´une interface graphique ces parametres dans le fichier INI .
    Mon probleme est que les parametres SecureUser et SecurePassword sont cryptees a l´aide d´une DLL externe (Powerbuilder) .Et que certains des caracteres du string crypte resultant ne sont pas lisible par Java ...
    Lorsque je veux changer ces parametres , pas de probleme j´appelle ma DLL .

    Par contre , si je veux changer un parametre non crypte , je dois faire des ReadLine () en envoyant chacune des lignes dans un Printwriter , quand je trouve la ligne qui m´interesse je cree une ligne diffferente et l´envoie dans le PrintWriter . Mais inevitablement je suis amene a lire les parametres cryptees pour les envoyer dans le Printwriter car il n´est pas possible si je me trompe de remplacer directement une ligne dans un fichier !!
    Du coup dans le ficheir INI resultant , les string cryptees comportent des ? pour les caracteres qu´il n´arrive pas a lire .

    Du coup , je dois trouver un moyen de pouvoir remplacer une ligne sans avoir a copier entierement le fichier . Je ne peux pas utiliser la classe RandomAccessFile car les parametres ont une valeur variable .
    Je ne veux et peux pas non plus rappeller ma DLL a chaque fois que je dois reecrire le parametre crypte lorsque je configure un parametre non crypte . Cela influe beaucoup trop sur les performances du logiciel .

    Je dois donc trouver une solution technique pour remplacer seulement une ligne d´un fichier ou bien ecrire et lire en meme temps dans le fichier . Quelqu´un dispose t il du savoir faire technique pour resoudre ce probleme ?

    Merci beaucoup !!

  2. #2
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Bonjour,

    Il existe de nombreux exemples de classe permettant de lire un fichier INI par exemple ini4j.

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    si t'arrive pas a lire en tant que "texte" ton fichier dans son intégralité, tu dois le considérer comme un fichier binaire et le lire en tant que tel (avec des read(byte[])) et, pour les section que tu veux manipuler comme du texte, les faire passer dans un charset decoder. Pour modifier ton fichier, de toutes facons, pas le choix tu va devoir tout lire et réécrire (que ce soit toi ou une librairie qui le fasse)

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    merci jowo,

    J´utilisais INI4J auparavant mais les performances etaient deplorables en ecriture et lecture . Cela va beaucoup plus vite avec mon propre algo .
    Et j´avais deja ce probleme avec ini4j , internally , il lisait tout le fichier et le copie , donc j´avais egalement ces parametres cryptees contenant des points d´interrogation ....

    Tchitze ,ton idee me semble interessante . Donc il faudrait que je contiue de faire des ReadLine() . Et lorsque j´arrive aux lignes cryptees , que je fasse read(byte[])) et les envoie telles qu´elle dans le flux de sortie ?

    Merci beaucoup

  5. #5
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    De tout façon, si tu veux modifier un fichier texte, tu devras copier et réécrire ce fichier.

    Si ton fichier contient des caractères "non-visibles", il faut le traiter complètement comme un fichier binaire.

    Que se passe-t-il si ton texte crypté contient le caractère Ctrl-Z (carctère indiquant la fin d'un fichier texte sous Windows)?

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par gerudo Voir le message
    Donc il faudrait que je contiue de faire des ReadLine() . Et lorsque j´arrive aux lignes cryptees , que je fasse read(byte[])) et les envoie telles qu´elle dans le flux de sortie ?
    Non, je dit qu'il faut oublier readline(). Readline va lire jsuqu'à atteindre un \n, hors tu sais pas que c'est une ligne binaire tant que t'as pas lu le nom de la clé, et quand t'as atteind le binaire il est trop tard pour readline, les dégats sont fait. Les Reader ne sont pas fait pour des fichier binaires. Tu traite tout en binaire et tu fait la conversion en texte toit même.

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Les strings cryptes ne peuvent pas contenir de sequences comme Ctrl-Z , donc pas de probleme de ce cote .

    Donc la je suis un peu perdu concernant les methodes a utiliser pour atteindre cette objectif .
    Dans mon code, je dois utiliser la methode read(char[] cbuf, int off, int len) de BufferedReader au lieu de readLine() . Lorsque je cherche une ligne il faut que je fasse une comparaison :

    if (ligne.startsWith(phrase.toCharArray()==true){
    //change ligne
    }
    et puis des Println avec Printwriter

    Est ce possible que je fasse des Println(String ligne) lorsque je lis des lignes non cryptees et lrosque j´errive sur une ligne cryptee un Println(char ligne) ?

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Tchize ,

    Si j´ecris dans un ficheir binaire , est ce que je pourrais l´ouvrire avec Notepad Windows apres ?

    Meme si c´est de l´unicode , j´ai peur que si je refais la conversion en texte depuis java , les strings encryptes ne seront pas affiches correctment ...

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par gerudo Voir le message
    Tchize ,

    Si j´ecris dans un ficheir binaire , est ce que je pourrais l´ouvrire avec Notepad Windows apres ?

    Meme si c´est de l´unicode , j´ai peur que si je refais la conversion en texte depuis java , les strings encryptes ne seront pas affiches correctment ...
    d'après ce que tu nous dit depuis le début, c'est pas du texte, donc de toutes facons notepad ne sais déjà pas les afficher correctement. J'ai l'impression qu'on est pas sur la même longueur d'onde. Tu peux attacher un fichier d'exemple au forum qu'on soit sur de quoi tu parle. PArce que pour moi on parle de binaire dès le début, mais c'est peut etre juste un problème d'encodage en réalité.

    pour le bufferedreader, comme jai dit, si tu travaille en binaire, tu oublie. Il te reste que les inputstream.

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Ok j´envoie un fichier en piece jointe .
    Avec Notepas , y´a pas de probleme pour le lire . C´est java qui ne peux pas ecrire ces caracteres . L´encryptione est realisee par une DLL externe utilisant une table de caracteres pas reconnue par Java .
    Fichiers attachés Fichiers attachés

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    je sais pas quelle table de caractères c'est, mais sous windows 2003 server, notepad n'est pas capable de trouver un encodage correspondant. Mon gedit sous linux non plus. Si tu connais l'encodage en question, donne le on pourra t'aiguiller sur des api fournissant de tels charset. Mais a mon avis, ca injecte de l'affreux pur binaire dans ton .ini (je savais meme pas que windows tolérait ça )

  12. #12
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Hmmm,

    C´est curieux .Cela signifie que la table de caractere utilisee n´est pas une fournir par Windows XP sur lequel je travaille . Je ne parviens malheureusement pas a determiner la table de caractere utilisee car la DLl est vieille et la documentation n´en dit rien.

    Y´a t il moyen avec la classe Carset d´importer toutes les tables de caracteres de mon dossier Windows Font ?
    Cela devrait regler mon probleme !!

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    une font n'est pas un charset. La fonte sert à l'affichage, le charset à la conversion binaire / texte. C'est pas parce que 'ca a l'air d'afficher autre chose que des carrés' sous notepad, que notpad a reconnu le cahrset utilisé. De plus, la méthode utilisé par notepad pour détecter le charset est normalement la même quel que soit les applications installée (c'est hardcodé dans notepad). Donc a moins que t'aie précisé manuellement un charset sous notepad, non, il n'a rien reconnu du tout et on en revien au point de départ, tu dois lire le fichier comme un fichier binaire car il contient autre chose que des caractères.

  14. #14
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Ces mots de passe cryptees sont utilisees par des applications PowerBuilder pour se conencter a une base de donnee . Or apres avoir encrypte ces parametres avec la DLL . Je peux me connecter a base de donnees apres avoir lance le logiciel .
    Or apres un traitement avec java , pour modifier un autre parametre ,non crypte ; java ne va pas reconnaitre certains caracteres et mettre des points d´interrogation a la place .

    Donc meme si Notepad ne les dechiffre pas bien vraiment , c´est le bon string pour les applis , quand ils le dechiffrent pour se connecter .Il faut vraiment que je trouve un moyen d´obtenir le meme String ou sequence bianire plutot qu´apres avoir utilise la DLL .

    je ne peux donc pas creer un fichier binaire sinon les applis powerbuilder ne vont pas pouvoir lire ces lignes je pense .Sans parler de l´impact sur les performances !!

  15. #15
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Hmm je crois que je commence a comprendre ce que vous voulez dire !!
    Donc je dois lire tout mon fichier avec des read(char) .
    Mais apres ,est ce que dans le flux de sortie ; j´ecris des char ? Est ce que je pourrais l´ouvrir avec notepad apres ?

  16. #16
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    des read (byte) pour du binaire. Oublie la lecture de char, si c'est du binaire tu pourra pas. C'est pas parce que java affiche ? qu'il a mal lu le charactère. Et c'est pas parce qu'il affiche quelque chose qu'il la bien lu. L'affichage est géré par les fontes.

    Certains charset imposent des équivalence entre des séries de byte, ce qui fait que tu lit le texte, tu le réécrit, il a changé au point de vue binaire, mais du point de vue unicode, c'est le même.

    Donc soit tu lit à l'aveuglette avec un charset genre iso-8859-1 et tu espère que ca casse rien (c'est un peu du petit bonheur la chance, mais tant que t'as pas d'exception avec l'iso-8859-1 comme tout est sur 1 byte tu devrais t'en sortir), soit tu fait du pur binaire (et evidement c'est plus long)

  17. #17
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Ca y´est j´ai reussi a recopier de facon identique un fichier INI y compris les parametres cryptees .

    Mon code est le suivant :

    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
    public class Main {
     
    	public static void main(String[] args){
     
                try{
     
                    long startChrono=System.currentTimeMillis();
     
    			int i;
     
    		BufferedInputStream in = new BufferedInputStream(new FileInputStream("M:\\DataEdit.ini"));
     
    			try{
     
    			BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("M:\\DataEdit2.ini"));
     
    try{	
    					while((i=in.read())!=-1){
    					out.write(i);
     
    					}
    					out.flush(); 
    				}finally{
     
    					out.close();
    				}
    			}
    			finally{
    				in.close();
                                    System.out.println("durée="+(System.currentTimeMillis()-startChrono+" ms "));
     
    			}
    		}
    		catch(IOException e){
    			System.out.println(e);
    		}
     
     
    	}
    }
    Maintenant , mon probleme et que je lis des octets un par un .Donc comemnt je fais pour realiser des conditions sur les strings ?
    Genre avant je pouvais faire un readline().startswith("Database") et hop je savais que j´arrivais dans la section que je voulais configurer .Mais la avec des octets un par un , je vois pas tres bien !!

    Merci beaucoup

  18. #18
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    En lisant ton flux de byte, il faut reconnaître les lignes et la structure d'un fichier INI ([SECTION], ;commentaire et couple clé=valeur).

  19. #19
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Points : 21
    Points
    21
    Par défaut
    Oui je sais ce qu´il y a faire pour determiner le parametre . Mais qu´elle est la classe IO la plus appropriee pour ca ?

    Je pensais a ByteArrayOutputStream , et determiner lorsque l´octet est 1310 que c´est une ligne et faire un to String pour la traiter avant de la repasser en byte . Mais la question de la performance est tres improtante .
    J´aimerais bien trouver un moyen de lire des lignes de bytes !!

    merci baucoup

  20. #20
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    tu repère tes débuts de ligne par comparaison du byte lu avec le byte correspondant à \n ou \r (le retour à la ligne dépendant de l'os, de l'éditeur et des librairies utilisées pour écrire le fichier)
    ensuite tu compare byte par byte avec la séquence de byte correspondant à "Database"

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Modifier une ligne d’un fichier .txt (et seulement celle-ci)
    Par Jean-Pierre49 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/10/2011, 14h02
  2. Changer une propriété column site sans ouvrir le fichier
    Par jo_dalton dans le forum SharePoint
    Réponses: 5
    Dernier message: 04/06/2009, 11h23
  3. Réponses: 4
    Dernier message: 03/07/2008, 16h46
  4. copier une partie d´un fichier dans un autre
    Par makohsarah dans le forum Langage
    Réponses: 8
    Dernier message: 23/08/2006, 09h53
  5. Réponses: 5
    Dernier message: 27/02/2006, 09h14

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