Boooonjour !
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 :
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 {"").
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'.
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
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