Résolu Java : modification du fichiers launcher_profils.json

Discussion dans 'Support Minecraft' créé par Alex Fatta, 10 Avril 2018.

  1. Alex Fatta

    Alex Fatta Commandant de la Flotte et de la Horde

    Inscrit:
    13 Août 2014
    Messages:
    1 292
    J'aime reçus:
    174
    Boooonjour ! :D

    Je ne suis jamais venu dans cette section, j'espère donc être au bon endroit. Je pense en tout cas que ce topic sera mieux ici que dans "Support serveur et plugins". Bref.

    Un ami à moi m'a demandé de coder un installateur de modpack dont le cahier des charges est le suivant :
    • Grâce à une petite interface graphique, avoir les infos nécessaire sur le modpack, un bouton "Install" et "Quit"
    • Télécharger un fichier compressé sur un site et l'extraire dans un endroit précis.
    • Créer un profil "Modpack" dans le launcher du joueur.

    Les deux premiers points sont codés et fonctionnels. Toutefois, le dernier point me complique la tâche. Pour modifier le profil, je pense que modifier le fichier "launcher_profils.json" est le meilleur moyen d'y parvenir.

    (Bon je dit où j'en suis maintenant et je dirai mon soucis après).

    Bon, le fichier launcher_profils.json étant rempli d'informations, il me faut isoler la partie des profils (pour ça je check quand est-ce que j'arrive à la ligne " "profils {"").
    Code:
    //Création des stream pour la lecture et l'écriture des fichiers.
            FileInputStream fisConfInstaller = new FileInputStream(CheckModPackFolder.getConfinstaller());
            BufferedReader brConfigInstaller = new BufferedReader(new InputStreamReader(fisConfInstaller)); //Lecture du fichier ConfInstaller
            
            FileInputStream fisFileProfile = new FileInputStream(CheckModPackFolder.getFileProfile());
            BufferedReader brFileProfile = new BufferedReader(new InputStreamReader(fisConfInstaller));
    
            BufferedOutputStream bosFileProfile = new BufferedOutputStream(new FileOutputStream(CheckModPackFolder.getFileProfile()));
            //Buffer de sortie
            
            BufferedOutputStream bosCopy = new BufferedOutputStream(new FileOutputStream(new File(/*CheckModPackFolder.getMinecraftPath() + */"launcher_profiles_wizard_copy.json")));
            
    
    
    //Mise à la ligne 'profil'
            final String profileLine = "  \"profiles\": {";
    
            while (!brFileProfile.equals(profileLine)) {
                brFileProfile.readLine();
            }
    Concernant le nouveau profil, il est déjà écrit dans un fichier, je n'ai donc qu'à le "copier/coller" dans le fichier de profil. Et là (en me rappelant des cours d'OpenClassroom), si je colle le profil déjà prêt dans le fichier launcher_profils.json, bah ca écrira par dessus un autre profil (donc un autre profil sera supprimé à la place) et ca je ne veux pas. Donc ce que je voudrais faire :

    1- Aller à la ligne "profil {".
    2- Sauvegarder (dans un tableau ou en copiant le fichier) le reste du fichier de profil.
    3- Coller le profil déjà défini ailleurs dans le fichier de profil
    4- Coller à la suite de ce profil, le reste du fichier profil original.

    Je ne sais pas si j'ai été assez clair dans mes explications.

    Et là ou je galère, c'est dans la sauvegarde des profils existants. Je ne parviens pas à trouver comment sauvegarder le reste des profils.

    J'ai eu comme idées les suivantes :
    - Copier le fichier launcher_profils.json avant la modification afin d'avoir une copie des profils et les copier coller ensuite après ajout du nouveau profil.

    - Stocker le reste du fichier dans un tableau de char ou de String puis tout recoller ensuite.

    Le problème est le suivant : je ne parviens pas à trouver comment réussir à faire l'une de ces deux options.

    Bien évidemment si vous en avez une troisième je suis preneur :)

    Voilà ! Je vous met le code déjà fais ci-dessous. Pour informations : le fichier qui contient le profil déjà fait se nomme 'ConfInstaller.yml'.

    Code:
    package fr.alexfatta.ftbWizard.editProfilFile;
    
    import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    import fr.alexfatta.ftbWizard.downloadFileManager.CheckModPackFolder;
    
    public class EditProfils {
    
        private static char[] listOfElementOfFile;
        
        /*
         * 1- Copier le fichier de profil
         * 2- Dans profil.json, aller à la ligne 'profil' puis à la ligne suivante coller le profil
         * 3- Définir la ligne à écrire après le nouveau profil et définir la ligne à copier depuis le fichier copié
         * 4- A partir de la ligne d'après, recoller la suite du fichier profil
         */
    
        public static void editProfilsFile() throws FileNotFoundException, IOException {
    
            //Création des stream pour la lecture et l'ecriture des fichiers.
            FileInputStream fisConfInstaller = new FileInputStream(CheckModPackFolder.getConfinstaller());
            BufferedReader brConfigInstaller = new BufferedReader(new InputStreamReader(fisConfInstaller)); //Lecture du fichier ConfInstaller
            
            FileInputStream fisFileProfile = new FileInputStream(CheckModPackFolder.getFileProfile());
            BufferedReader brFileProfile = new BufferedReader(new InputStreamReader(fisConfInstaller));
    
            BufferedOutputStream bosFileProfile = new BufferedOutputStream(new FileOutputStream(CheckModPackFolder.getFileProfile()));
            //Buffer de sortie
            
            BufferedOutputStream bosCopy = new BufferedOutputStream(new FileOutputStream(new File(/*CheckModPackFolder.getMinecraftPath() + */"launcher_profiles_wizard_copy.json")));
            
            
            //Copie du fichier original profil.json
            byte[] buf = new byte[16];
            @SuppressWarnings("unused")
            int n = 0;
            while (((n = fisFileProfile.read(buf)) >= 0)){//Copie du fichier profile
                bosCopy.write(buf); //Dosier local, copie des profils
            }
            
            bosCopy.close(); //Fin de copie du fichier originel
            
            
            //Mise à la ligne 'profil'
            final String profileLine = "  \"profiles\": {";
    
            while (!brFileProfile.equals(profileLine)) {
                brFileProfile.readLine();
            }
            System.out.println(profileLine); //Sortie de la ligne 'profil'
            
            if (brFileProfile.equals(profileLine)){
                //On est à la ligne profil
                
                //Sauvegarder le reste du fichier dans un tableau
                
                
                //Coller le nouveau profil depuis le ConfInstaller
                pasteNewProfileFromConfInstaller(fisConfInstaller, brConfigInstaller ,bosFileProfile);
                brFileProfile.readLine();
                
                
                //Coller la suite du fichier original profil.json à la suite du nouveau profil
                
                
                
            }
            
            fisFileProfile.close();
            brFileProfile.close();
            
            bosFileProfile.close();
            
            fisConfInstaller.close();
            brConfigInstaller.close();
        }
    
    
        public static void pasteNewProfileFromConfInstaller(FileInputStream sourceFIS, BufferedReader fileReader, BufferedOutputStream targetBOS) throws IOException {
            
            fileReader.readLine();
            fileReader.readLine();
            
            byte[] buf = new byte[16];
            @SuppressWarnings("unused")
            int n, i = 0;
            while (((n = sourceFIS.read(buf)) >= 0) && i <= 9){ //Recupération dans la source des données
                targetBOS.write(buf); //Ecriture dans le fichier cible
                ++i;
            }
        }
    
    
        public char[] getListOfElementOfFile() {
            return listOfElementOfFile;
        }
    
    
        public void setListOfElementOfFile(char[] listOfElementOfFile) {
            EditProfils.listOfElementOfFile = listOfElementOfFile;
        }
    
    }
    
    En vous remerciant d'avance, et je pense notamment à @Detobel36 @DiscowZombie @ShE3py @robin4002 et aux autres développeurs/personnes de la communauté qui sont assez lancés dans le domaine ;)

    Si je n'ai pas été assez clair, je donnerai les infos manquantes ;)

    Merci encore à tous/toutes !

    AlexFatta
     
  2. robin4002

    robin4002 Étudiant en informatique
    Staff Responsable technique Responsable forum

    Inscrit:
    12 Novembre 2012
    Messages:
    16 290
    J'aime reçus:
    2 600
    Salut,
    Tu devrais utiliser argo ou gson pour manipuler un json au lieu des le modifie directement comme du texte brute.

    Au passage, tu es en train de réinventer la roue : https://github.com/FFMT/ModPackInstaller (celui-ci sait aussi mettre à jour automatiquement les mods).
     
    DiscowZombie apprécie ceci.
  3. Alex Fatta

    Alex Fatta Commandant de la Flotte et de la Horde

    Inscrit:
    13 Août 2014
    Messages:
    1 292
    J'aime reçus:
    174
    Merci Robin !

    Alors pour gson, je suis allé voir ici : https://www.jmdoudoux.fr/java/dej/chap-gson.htm

    Je remarque que c'est très complet. Dans mon cas, aurait-tu un tuto vers lequel m'orienter afin de m'aider à faire simplement ce que je cherche ?

    Et pour ce que tu as envoyé, je ne comprends pas vraiment comment m'en servir :/ Je concois bien le travail fourni, mais comment puis-ju m'en servir ? Tout importer sur un IDE et exporter ensuite le JAR ? Je n'ai jamais DL depuis Github. Après je cherche simplement à créer un profil simplement sur le launcher ;)

    AlexFatta
     
  4. robin4002

    robin4002 Étudiant en informatique
    Staff Responsable technique Responsable forum

    Inscrit:
    12 Novembre 2012
    Messages:
    16 290
    J'aime reçus:
    2 600
    ShE3py apprécie ceci.
  5. Alex Fatta

    Alex Fatta Commandant de la Flotte et de la Horde

    Inscrit:
    13 Août 2014
    Messages:
    1 292
    J'aime reçus:
    174
    Bonsoir !

    Bon ca fait un petit moment mais je me remet dedans. J'ai bien inclus tous les éléments et j'ai réussi à trouver argo-5.4 depuis ce site : http://argo.sourceforge.net/downloads.html .

    Toutefois, l'import argo.jdom.JsonRootNode; n'existe pas dans l'archive, enfin Eclipse ne trouve pas la classe. Aurait-tu un lien depuis lequel je pourrais prendre une version d'argo qui contient la JsonRootNode ? :)

    Aussi, j'ai lu le code que tu as fourni sur github, c'est pas si compliqué que ça Argo en fait ^^

    AlexFatta
     
  6. robin4002

    robin4002 Étudiant en informatique
    Staff Responsable technique Responsable forum

    Inscrit:
    12 Novembre 2012
    Messages:
    16 290
    J'aime reçus:
    2 600
  7. Alex Fatta

    Alex Fatta Commandant de la Flotte et de la Horde

    Inscrit:
    13 Août 2014
    Messages:
    1 292
    J'aime reçus:
    174
    Bonjour !

    C'est bon j'ai réussi à adapter le code aux besoins. Je vous remercie pour votre aide ! :D

    AlexFatta
     

Partager cette page