Index: core/src/org/openstreetmap/josm/io/ValidatorErrorWriter.java
===================================================================
--- core/src/org/openstreetmap/josm/io/ValidatorErrorWriter.java	(revision 15889)
+++ core/src/org/openstreetmap/josm/io/ValidatorErrorWriter.java	(working copy)
@@ -1,10 +1,7 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.io;
 
-import java.io.BufferedWriter;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
+import java.io.*;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -60,7 +57,7 @@
      * Write validator errors to designated output target
      * @param validationErrors Test error collection to write
      */
-    public void write(Collection<TestError> validationErrors) {
+    public void write(Collection<TestError> validationErrors) throws IOException {
         Set<Test> analysers = validationErrors.stream().map(TestError::getTester).collect(Collectors.toCollection(TreeSet::new));
         String timestamp = DateUtils.fromDate(new Date());
 
@@ -67,65 +64,66 @@
         out.println("<?xml version='1.0' encoding='UTF-8'?>");
         out.println("<analysers generator='JOSM' timestamp='"+timestamp+"'>");
 
-        OsmWriter osmWriter = OsmWriterFactory.createOsmWriter(out, true, OsmChangeBuilder.DEFAULT_API_VERSION);
-        String lang = LanguageInfo.getJOSMLocaleCode();
+        try(OsmWriter osmWriter = OsmWriterFactory.createOsmWriter(out, true, OsmChangeBuilder.DEFAULT_API_VERSION)) {
+            String lang = LanguageInfo.getJOSMLocaleCode();
 
-        for (Test test : analysers) {
-            out.println("  <analyser timestamp='"+timestamp+"' name='"+XmlWriter.encode(test.getName())+"'>");
-            // Build map of test error classes for the current test
-            Map<ErrorClass, List<TestError>> map = new HashMap<>();
-            for (Entry<Severity, Map<String, Map<String, List<TestError>>>> e1 :
-                OsmValidator.getErrorsBySeverityMessageDescription(validationErrors, e -> e.getTester() == test).entrySet()) {
-                for (Entry<String, Map<String, List<TestError>>> e2 : e1.getValue().entrySet()) {
-                    ErrorClass errorClass = new ErrorClass(e1.getKey(), e2.getKey());
-                    List<TestError> list = map.get(errorClass);
-                    if (list == null) {
-                        list = new ArrayList<>();
-                        map.put(errorClass, list);
+            for (Test test : analysers) {
+                out.println("  <analyser timestamp='" + timestamp + "' name='" + XmlWriter.encode(test.getName()) + "'>");
+                // Build map of test error classes for the current test
+                Map<ErrorClass, List<TestError>> map = new HashMap<>();
+                for (Entry<Severity, Map<String, Map<String, List<TestError>>>> e1 :
+                        OsmValidator.getErrorsBySeverityMessageDescription(validationErrors, e -> e.getTester() == test).entrySet()) {
+                    for (Entry<String, Map<String, List<TestError>>> e2 : e1.getValue().entrySet()) {
+                        ErrorClass errorClass = new ErrorClass(e1.getKey(), e2.getKey());
+                        List<TestError> list = map.get(errorClass);
+                        if (list == null) {
+                            list = new ArrayList<>();
+                            map.put(errorClass, list);
+                        }
+                        e2.getValue().values().forEach(list::addAll);
                     }
-                    e2.getValue().values().forEach(list::addAll);
                 }
-            }
-            // Write classes
-            for (ErrorClass ec : map.keySet()) {
-                out.println("    <class id='"+ec.id+"' level='"+ec.severity.getLevel()+"'>");
-                out.println("      <classtext lang='"+XmlWriter.encode(lang)+"' title='"+XmlWriter.encode(ec.message)+"'/>");
-                out.println("    </class>");
-            }
+                // Write classes
+                for (ErrorClass ec : map.keySet()) {
+                    out.println("    <class id='" + ec.id + "' level='" + ec.severity.getLevel() + "'>");
+                    out.println("      <classtext lang='" + XmlWriter.encode(lang) + "' title='" + XmlWriter.encode(ec.message) + "'/>");
+                    out.println("    </class>");
+                }
 
-            // Write errors
-            for (Entry<ErrorClass, List<TestError>> entry : map.entrySet()) {
-                for (TestError error : entry.getValue()) {
-                    LatLon ll = error.getPrimitives().iterator().next().getBBox().getCenter();
-                    out.println("    <error class='"+entry.getKey().id+"'>");
-                    out.print("      <location");
-                    osmWriter.writeLatLon(ll);
-                    out.println("/>");
-                    for (OsmPrimitive p : error.getPrimitives()) {
-                        p.accept(osmWriter);
-                    }
-                    out.println("      <text lang='"+XmlWriter.encode(lang)+"' value='"+XmlWriter.encode(error.getDescription())+"'/>");
-                    if (error.isFixable()) {
-                        out.println("      <fixes>");
-                        Command fix = error.getFix();
-                        if (fix instanceof AddPrimitivesCommand) {
-                            Logging.info("TODO: {0}", fix);
-                        } else if (fix instanceof DeleteCommand) {
-                            Logging.info("TODO: {0}", fix);
-                        } else if (fix instanceof ChangePropertyCommand) {
-                            Logging.info("TODO: {0}", fix);
-                        } else if (fix instanceof ChangePropertyKeyCommand) {
-                            Logging.info("TODO: {0}", fix);
-                        } else {
-                            Logging.warn("Unsupported command type: {0}", fix);
+                // Write errors
+                for (Entry<ErrorClass, List<TestError>> entry : map.entrySet()) {
+                    for (TestError error : entry.getValue()) {
+                        LatLon ll = error.getPrimitives().iterator().next().getBBox().getCenter();
+                        out.println("    <error class='" + entry.getKey().id + "'>");
+                        out.print("      <location");
+                        osmWriter.writeLatLon(ll);
+                        out.println("/>");
+                        for (OsmPrimitive p : error.getPrimitives()) {
+                            p.accept(osmWriter);
                         }
-                        out.println("      </fixes>");
+                        out.println("      <text lang='" + XmlWriter.encode(lang) + "' value='" + XmlWriter.encode(error.getDescription()) + "'/>");
+                        if (error.isFixable()) {
+                            out.println("      <fixes>");
+                            Command fix = error.getFix();
+                            if (fix instanceof AddPrimitivesCommand) {
+                                Logging.info("TODO: {0}", fix);
+                            } else if (fix instanceof DeleteCommand) {
+                                Logging.info("TODO: {0}", fix);
+                            } else if (fix instanceof ChangePropertyCommand) {
+                                Logging.info("TODO: {0}", fix);
+                            } else if (fix instanceof ChangePropertyKeyCommand) {
+                                Logging.info("TODO: {0}", fix);
+                            } else {
+                                Logging.warn("Unsupported command type: {0}", fix);
+                            }
+                            out.println("      </fixes>");
+                        }
+                        out.println("    </error>");
                     }
-                    out.println("    </error>");
                 }
+
+                out.println("  </analyser>");
             }
-
-            out.println("  </analyser>");
         }
 
         out.println("</analysers>");
Index: core/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java
===================================================================
--- core/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java	(revision 15889)
+++ core/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java	(working copy)
@@ -1,10 +1,7 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.io.session;
 
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.Writer;
+import java.io.*;
 import java.nio.charset.StandardCharsets;
 
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -27,7 +24,7 @@
     }
 
     @Override
-    protected void addDataFile(OutputStream out) {
+    protected void addDataFile(OutputStream out) throws IOException {
         exportData(layer.data, out);
     }
 
@@ -37,15 +34,17 @@
      * @param out output stream
      * @since 15386
      */
-    public static void exportData(DataSet data, OutputStream out) {
-        Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
-        OsmWriter w = OsmWriterFactory.createOsmWriter(new PrintWriter(writer), false, data.getVersion());
-        data.getReadLock().lock();
-        try {
-            w.write(data);
-            w.flush();
-        } finally {
-            data.getReadLock().unlock();
+    public static void exportData(DataSet data, OutputStream out) throws IOException {
+        try (Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
+             OsmWriter w = OsmWriterFactory.createOsmWriter(new PrintWriter(writer), false, data.getVersion());
+        ) {
+            data.getReadLock().lock();
+            try {
+                w.write(data);
+                w.flush();
+            } finally {
+                data.getReadLock().unlock();
+            }
         }
     }
 }
