Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

set encoding as UTF-8 for a FileWriter [duplicate]

Tags:

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();     }  }                                         
like image 239
NewToThis Avatar asked Feb 01 '16 14:02

NewToThis


People also ask

How do I change my encoding to UTF-8?

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.

How do I save a Java file as 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.


2 Answers

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); 
like image 164
VGR Avatar answered Sep 28 '22 08:09

VGR


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  } 
like image 44
Saandji Avatar answered Sep 28 '22 09:09

Saandji