ADDITIONAL SYSTEM INFORMATION : java -version: openjdk version "13-ea" 2019-09-17 OpenJDK Runtime Environment (build 13-ea+9) OpenJDK 64-Bit Server VM (build 13-ea+9, mixed mode, sharing) Windows 10 Home, Version 1803, Build 17134.590 A DESCRIPTION OF THE PROBLEM : If the underlying WritableByteChannel errors when closing a sun.nio.cs.StreamEncoder (as returned by Channels.newWriter), then the channel is not closed. This is somewhat similar to JDK-6266377, but is not dependent on using a BufferedWriter. STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : - Create a subclass of WritableByteChannel which errors when calling .write, and prints some debugging message when closing. - Use Channels.newWriter to wrap an instance of this channel. - Write to the writer, and then close it. EXPECTED VERSUS ACTUAL BEHAVIOR : EXPECTED - The channel would be closed the exception thrown from .write() is propagated. ACTUAL - The channel is not closed, and the error from .write() is thrown. ---------- BEGIN SOURCE ---------- import java.io.IOException; import java.io.Writer; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.WritableByteChannel; import java.nio.charset.StandardCharsets; class Scratch { public static void main( String[] args ) { ErroringByteChannel channel = new ErroringByteChannel(); try( Writer writer = Channels.newWriter( channel, StandardCharsets.UTF_8.newEncoder(), -1 ) ) { writer.write( "Test" ); } catch( IOException e ) { e.printStackTrace(); } } private static class ErroringByteChannel implements WritableByteChannel { private boolean open = true; @Override public int write( ByteBuffer src ) throws IOException { throw new IOException(); } @Override public boolean isOpen() { return open; } @Override public void close() { open = false; System.out.println( "Closing" ); } } } ---------- END SOURCE ----------
|