web-dev-qa-db-fra.com

définir le codage en UTF-8 pour un FileWriter

Ci-dessous est mon code, il est destiné à prendre deux fichiers .ckl, comparer les deux, ajouter les nouveaux éléments et créer un nouveau fichier fusionné. Le programme s'exécute correctement lorsqu'il est exécuté dans Netbeans. Toutefois, lors de l'exécution du fichier .jar, le programme ne semble pas coder le fichier au format UTF-8. Je suis plutôt novice en programmation et aimerais savoir où et comment il se peut que je devrais imposer cet encodage?

** J'ai supprimé le code Swing et d'autres lignes afin que seule ma méthode soit affichée, la méthode qui effectue toutes les comparaisons et les fusions.

public void mergeFiles(File[] files, File mergedFile) {

    ArrayList<String> list = new ArrayList<String>();

    FileWriter fstream = null;
    BufferedWriter out = null;
    try {
        fstream = new FileWriter(mergedFile, false);
        out = new BufferedWriter(fstream);
      } catch (IOException e1) {
        e1.printStackTrace();
    }
    // Going in a different direction. We are using a couple booleans to tell us when we want to copy or not. So at the beginning since we start
    // with our source file we set copy to true, we want to copy everything and insert vuln names into our list as we go. After that first file 
    // we set the boolean to false so that we dont start copying anything from the second file until it is a vuln. We set to true when we see vuln
    // and set it to false if we already have that in our list. 
    // We have a tmpCopy to store away the value of copy when we see a vuln, and reset it to that value when we see an </VULN>
    Boolean copy = true;
    Boolean tmpCopy = true;
    for (File f : files) {
        textArea1.append("merging files into: " + mergedFilePathway + "\n");
        FileInputStream fis;
        try {
            fis = new FileInputStream(f);
//                BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(mergedFile), "UTF-8"));
            BufferedReader in = new BufferedReader(new InputStreamReader(fis));
            String aLine;
            while ((aLine = in.readLine()) != null) {
                // Skip the close checklist and we can write it in at the end
                if (aLine.trim().equals("</iSTIG>")) {
                    continue;
                }
                if (aLine.trim().equals("</STIGS>")) {
                    continue;
                }
                if (aLine.trim().equals("</CHECKLIST>")) {
                    continue;
                }
                if (aLine.trim().equals("<VULN>")) {
                    // Store our current value of copy
                    tmpCopy = copy;
                    copy = true;
                    String aLine2 = in.readLine();
                    String aLine3 = in.readLine();
                    String nameLine = in.readLine();

                    if (list.contains(nameLine.trim())) {
                        textArea1.append("Skipping: " + nameLine + "\n");
                        copy = false;
                        while (!(aLine.trim().equals("</VULN>"))) {
                            aLine = in.readLine();
                        }
                        continue; // this would skip the writing out to file part
                    } else {
                        list.add(nameLine.trim());
                        textArea1.append("::: List is now :::");
                        textArea1.append(list.toString() + "\n");
                    }
                    if (copy) {
                        out.write(aLine);
                        out.newLine();
                        out.write(aLine2);
                        out.newLine();
                        out.write(aLine3);
                        out.newLine();
                        out.write(nameLine);
                        out.newLine();
                    }
                } else if (copy) {
                    out.write(aLine);
                    out.newLine();
                }
                // after we have written to file, if the line was a close vuln, switch copy back to original value
                if (aLine.trim().equals("</VULN>")) {
                    copy = tmpCopy;
                }
            }

            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        copy = false;
    }

    // Now lets add the close checklist tag we omitted before
    try {
        out.write("</iSTIG>");
        out.write("</STIGS>");
        out.write("</CHECKLIST>");
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}                                        
10
NewToThis

Java possède une documentation exhaustive et très informative . Gardez-le en signet. Consultez-le en premier, chaque fois que vous rencontrez des difficultés. Vous constaterez que c'est souvent utile.

Dans ce cas, la documentation sur FileWriter dit:

Les constructeurs de cette classe supposent que le codage de caractères par défaut et la taille de tampon d'octets par défaut sont acceptables. Pour spécifier vous-même ces valeurs, construisez un OutputStreamWriter sur un FileOutputStream.

Si vous voulez être sûr que votre fichier sera écrit en UTF-8, remplacez ceci:

FileWriter fstream = null;
BufferedWriter out = null;
try {
    fstream = new FileWriter(mergedFile, false);

avec ça:

Writer fstream = null;
BufferedWriter out = null;
try {
    fstream = new OutputStreamWriter(new FileOutputStream(mergedFile), StandardCharsets.UTF_8);
25
VGR

Pour ceux qui utilisent FileWriter afin d’ajouter à un fichier existant, ce qui suit fonctionnera

try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true), StandardCharsets.UTF_8)) {

    //code

}
6
Saandji

Vous pouvez simplement l'exécuter avec la commande Java -Dfile.encoding=UTF-8 -jar yourjar.jar.

Suivez this pour plus d’informations.

0
BlueMoon93

Voici un bon exemple de la construction d'un BufferWriter avec un OutputStream spécifiant le codage UTF.

0
Quinn Carver