it-swarm.com.de

festlegen der Codierung als UTF-8 für einen FileWriter

Unten ist mein Code. Er soll zwei .ckl-Dateien aufnehmen, die beiden vergleichen, die neuen Elemente hinzufügen und eine neue zusammengeführte Datei erstellen. Das Programm wird korrekt ausgeführt, wenn es in Netbeans ausgeführt wird. Beim Ausführen der JAR-Datei scheint das Programm die Datei jedoch nicht in UTF-8 zu codieren. Ich bin ziemlich neu in der Programmierung und würde gerne wissen, wo oder wie ich diese Kodierung erzwingen kann.

** Ich habe den Swing-Code und andere Zeilen entfernt, so dass nur meine Methode angezeigt wird, die Methode, die das Vergleichen und Zusammenführen ausführt.

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 verfügt über umfangreiche, sehr informative Dokumentation . Behalten Sie das Lesezeichen bei. Lesen Sie es zuerst, wenn Sie Schwierigkeiten haben. Sie werden feststellen, dass es häufig hilfreich ist.

In diesem Fall sagt die Dokumentation für FileWriter :

Die Konstruktoren dieser Klasse gehen davon aus, dass die Standardzeichencodierung und die Standardbytepuffergröße akzeptabel sind. Um diese Werte selbst festzulegen, erstellen Sie einen OutputStreamWriter auf einem FileOutputStream.

Wenn Sie sicher gehen wollen, dass Ihre Datei als UTF-8 geschrieben wird, ersetzen Sie dies durch:

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

mit diesem:

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

Für diejenigen, die FileWriter verwenden, um an eine vorhandene Datei anzuhängen, wird Folgendes funktionieren

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

    //code

}
6
Saandji

Sie können es einfach mit dem Befehl Java -Dfile.encoding=UTF-8 -jar yourjar.jar ausführen.

Folgen Sie das für weitere Informationen.

0
BlueMoon93

Hier ist ein gutes Beispiel wie man einen BufferWriter mit einem OutputStream erstellt, der die UTF-Codierung angibt.

0
Quinn Carver