diff --git a/guava-tests/test/com/google/common/io/BaseEncodingTest.java b/guava-tests/test/com/google/common/io/BaseEncodingTest.java index 3780ede9361a..29e9f907944c 100644 --- a/guava-tests/test/com/google/common/io/BaseEncodingTest.java +++ b/guava-tests/test/com/google/common/io/BaseEncodingTest.java @@ -558,6 +558,17 @@ private static void testStreamingDecodes(BaseEncoding encoding, String encoded, } } + @GwtIncompatible // Writer + public void testEncodingStream_closeIsIdempotent() throws IOException { + StringWriter writer = new StringWriter(); + OutputStream encodingStream = base64().encodingStream(writer); + encodingStream.write(0); + encodingStream.close(); + assertThat(writer.toString()).isEqualTo("AA=="); + encodingStream.close(); + assertThat(writer.toString()).isEqualTo("AA=="); + } + public void testToString() { assertThat(base64().toString()).isEqualTo("BaseEncoding.base64().withPadChar('=')"); assertThat(base32Hex().omitPadding().toString()) diff --git a/guava/src/com/google/common/io/BaseEncoding.java b/guava/src/com/google/common/io/BaseEncoding.java index 44a2281ecf24..8b292d95bb01 100644 --- a/guava/src/com/google/common/io/BaseEncoding.java +++ b/guava/src/com/google/common/io/BaseEncoding.java @@ -646,6 +646,7 @@ public OutputStream encodingStream(Writer out) { int bitBuffer = 0; int bitBufferLength = 0; int writtenChars = 0; + boolean closed = false; @Override public void write(int b) throws IOException { @@ -667,6 +668,10 @@ public void flush() throws IOException { @Override public void close() throws IOException { + if (closed) { + return; + } + closed = true; if (bitBufferLength> 0) { int charIndex = (bitBuffer << (alphabet.bitsPerChar - bitBufferLength)) & alphabet.mask; out.write(alphabet.encode(charIndex)); @@ -677,6 +682,7 @@ public void close() throws IOException { writtenChars++; } } + bitBufferLength = 0; } out.close(); }