Skip to content

Fix FileWriterWithEncoding.Builder ignoring any Charset but the default - #877

Open
lenamonj wants to merge 1 commit into
apache:masterfrom
lenamonj:io-file-writer-with-encoding-charset
Open

lenamonj wants to merge 1 commit into
apache:masterfrom
lenamonj:io-file-writer-with-encoding-charset

Conversation

@lenamonj

@lenamonj lenamonj commented Sep 7, 2026

Copy link
Copy Markdown

FileWriterWithEncoding.Builder seeds its encoder from the default Charset, and getEncoder() throws IllegalStateException when Charset and encoder disagree. So setCharset(UTF_16) throws at get(), and setCharsetEncoder(UTF_16.newEncoder()) throws too, because the other half is still the default: the builder could not write any encoding but the platform default. The class Javadoc's Charset example also passes a Charset to setCharsetEncoder, which does not compile.

The builder now keeps the pair consistent as ReaderInputStream.Builder does: setCharset refreshes the encoder, setCharsetEncoder sets the Charset, and the mismatch guard, with nothing left to catch, is removed. The example calls setCharset.

Tests: testBuilder_nonDefaultCharset and testBuilder_nonDefaultCharsetEncoder, red on master and green with the change. Default Maven goal green.

  • Read the contribution guidelines for this project.
  • Read the ASF Generative Tooling Guidance if you use Artificial Intelligence (AI).
  • I used AI to create any part of, or all of, this pull request. Which AI tool was used to create this pull request, and to what extent did it contribute? Claude (Anthropic) found the defect and drafted the fix and tests; I reviewed them, reproduced the failure on a fresh clone of master, and ran the default Maven goal.
  • Run a successful build using the default Maven goal with mvn; that's mvn on the command line by itself.
  • Write unit tests that match behavioral changes, where the tests fail if the changes to the runtime are not applied. This may not always be possible, but it is a best practice.
  • Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
  • Each commit in the pull request should have a meaningful subject line and body. Note that a maintainer may squash commits during the merge process.

The builder seeded its CharsetEncoder from the default Charset and threw
IllegalStateException when the Charset and the encoder disagreed, so both
setCharset and setCharsetEncoder failed for anything but the platform
default. Keep the pair consistent the way ReaderInputStream.Builder does:
setCharset refreshes the encoder and setCharsetEncoder sets the Charset.
The mismatch guard has nothing left to catch and is removed. The class
Javadoc's Charset example passed a Charset to setCharsetEncoder, which does
not compile; it now calls setCharset.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant