Below is my code, it is intended to take two .ckl files, compare the two, add the new items and create a new merged file. The program executes correctly when run in Netbeans however, when executing the .jar the program doesn't appear to be encoding the file in UTF-8. I am rather new to programming and would like to know where or how I might need to be enforcing this encoding to take place?
** I have removed the Swing code and other lines so that only my method is shown, the method that does all of the comparing and merging.
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(); } }
UTF-8 Encoding in Notepad (Windows)Click File in the top-left corner of your screen. In the dialog which appears, select the following options: In the "Save as type" drop-down, select All Files. In the "Encoding" drop-down, select UTF-8.
In Java, the OutputStreamWriter accepts a charset to encode the character streams into byte streams. We can pass a StandardCharsets. UTF_8 into the OutputStreamWriter constructor to write data to a UTF-8 file.
Java has extensive, highly informative documentation. Keep it bookmarked. Refer to it first, whenever you have difficulty. You'll find it's frequently helpful.
In this case, the documentation for FileWriter says:
The constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable. To specify these values yourself, construct an OutputStreamWriter on a FileOutputStream.
If you want to be sure your file will be written as UTF-8, replace this:
FileWriter fstream = null; BufferedWriter out = null; try { fstream = new FileWriter(mergedFile, false);
with this:
Writer fstream = null; BufferedWriter out = null; try { fstream = new OutputStreamWriter(new FileOutputStream(mergedFile), StandardCharsets.UTF_8);
For those, who use FileWriter
in order to append to an existing file, the following will work
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true), StandardCharsets.UTF_8)) { //code }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With