diff --git a/freemarker-docgen-core/src/main/java/org/freemarker/docgen/core/FileUtil.java b/freemarker-docgen-core/src/main/java/org/freemarker/docgen/core/FileUtil.java
index 3ca637b..9cf1fec 100644
--- a/freemarker-docgen-core/src/main/java/org/freemarker/docgen/core/FileUtil.java
+++ b/freemarker-docgen-core/src/main/java/org/freemarker/docgen/core/FileUtil.java
@@ -26,7 +26,10 @@
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.Reader;
+import java.io.Writer;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.regex.Pattern;
@@ -346,5 +349,8 @@
         return path.length() > 0 && path.charAt(path.length() - 1) == File.separatorChar
                 ? path : path + File.separatorChar;
     }
-    
+
+    public static Writer newFileWriter(File outputFile) throws IOException {
+        return Files.newBufferedWriter(outputFile.toPath(), StandardCharsets.UTF_8);
+    }
 }
diff --git a/freemarker-docgen-core/src/main/java/org/freemarker/docgen/core/Transform.java b/freemarker-docgen-core/src/main/java/org/freemarker/docgen/core/Transform.java
index d9d3a25..204e492 100644
--- a/freemarker-docgen-core/src/main/java/org/freemarker/docgen/core/Transform.java
+++ b/freemarker-docgen-core/src/main/java/org/freemarker/docgen/core/Transform.java
@@ -21,12 +21,9 @@
 import static org.freemarker.docgen.core.DocBook5Constants.*;
 
 import java.io.BufferedReader;
-import java.io.BufferedWriter;
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStreamWriter;
 import java.io.StringReader;
 import java.io.Writer;
 import java.nio.charset.Charset;
@@ -1113,14 +1110,10 @@
         {
             logger.info("Generating ToC JSON...");
             Template template = fmConfig.getTemplate(FILE_TOC_JSON_TEMPLATE);
-            try (Writer wr = new BufferedWriter(
-                    new OutputStreamWriter(
-                            new FileOutputStream(
-                                    new File(destDir, FILE_TOC_JSON_OUTPUT)),
-                            UTF_8))) {
+            try (Writer wr = FileUtil.newFileWriter(new File(destDir, FILE_TOC_JSON_OUTPUT))) {
                 try {
                     SimpleHash dataModel = new SimpleHash(fmConfig.getObjectWrapper());
-                        dataModel.put(VAR_JSON_TOC_ROOT, tocNodes.get(0));
+                    dataModel.put(VAR_JSON_TOC_ROOT, tocNodes.get(0));
                     template.process(dataModel, wr, null, NodeModel.wrap(doc));
                 } catch (TemplateException e) {
                     throw new BugException("Failed to generate ToC JSON "
@@ -1133,14 +1126,10 @@
         {
             logger.info("Generating Sitemap XML...");
             Template template = fmConfig.getTemplate(FILE_SITEMAP_XML_TEMPLATE);
-            try (Writer wr = new BufferedWriter(
-                        new OutputStreamWriter(
-                                        new FileOutputStream(
-                                                        new File(destDir, FILE_SITEMAP_XML_OUTPUT)),
-                                        UTF_8))) {
+            try (Writer wr = FileUtil.newFileWriter(new File(destDir, FILE_SITEMAP_XML_OUTPUT))) {
                 try {
                     SimpleHash dataModel = new SimpleHash(fmConfig.getObjectWrapper());
-                            dataModel.put(VAR_JSON_TOC_ROOT, tocNodes.get(0));
+                    dataModel.put(VAR_JSON_TOC_ROOT, tocNodes.get(0));
                     template.process(dataModel, wr, null, NodeModel.wrap(doc));
                 } catch (TemplateException e) {
                     throw new BugException("Failed to generate Sitemap XML"
@@ -1214,11 +1203,7 @@
 
             logger.info("Generating Eclipse ToC...");
             Template template = fmConfig.getTemplate(FILE_ECLIPSE_TOC_TEMPLATE);
-            try (Writer wr = new BufferedWriter(
-                    new OutputStreamWriter(
-                            new FileOutputStream(
-                                    new File(destDir, FILE_ECLIPSE_TOC_OUTPUT)),
-                            UTF_8))) {
+            try (Writer wr = FileUtil.newFileWriter(new File(destDir, FILE_ECLIPSE_TOC_OUTPUT))) {
                 try {
                     SimpleHash dataModel = new SimpleHash(fmConfig.getObjectWrapper());
                     if (eclipseLinkTo != null) {
@@ -2641,16 +2626,11 @@
             throws TemplateException, IOException {
         Template template = fmConfig.getTemplate("page.ftlh");
         File outputFile = new File(destDir, fileName);
-        FileOutputStream fos = new FileOutputStream(outputFile);
-        OutputStreamWriter osw = new OutputStreamWriter(fos, UTF_8);
-        Writer writer = new BufferedWriter(osw, 2048);
-        try {
+        try (Writer writer = FileUtil.newFileWriter(outputFile)) {
             template.process(
                     dataModel,
                     writer, null,
                     NodeModel.wrap(currentFileTOCNode.getElement()));
-        } finally {
-            writer.close();
         }
     }
 
