Résolu Java : modification du fichiers launcher_profils.json

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 389
1
191
187
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
 
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).
 
  • J'aime
Reactions: DiscowZombie
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
 
  • J'aime
Reactions: ShE3py
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
 
Bonjour, je viens de tomber sur ce forum en cherchant une solution pour changer mon speudo sur ma deuxième configuration minecraft (pour jouer a deux sur un serveur avec un seul compte), mais je ne trouve pas le fichier json et de mod pour pouvoir changer son speudo.
Est-ce que c'est encore possible et est-ce que ce mod est disponible ?
 
Je crois qu'il n'est plus possible de changer le pseudo actuellement, il est généré lors de la connexion à partir des informations d'identifications Microsoft.

Cette discussion date de 2018, il y a plus de 5 ans, les choses ont bien changé depuis.