Inconsistencies when creating a Reader from a Path
Norbert Kiesel
nkiesel at gmail.com
Thu Feb 27 19:33:16 UTC 2020
The following 2 ways to construct a `Reader` for a `Path` look very
similar (with a slight edge for the first one because it is shorter):
```java
Reader reader1 = Files.newBufferedReader(path, StandardcharSets.UTF_8);
Reader reader2 = new BufferedReader(new
InputStreamReader(Files.newInputStream(path), StandardCharsets.UTF_8));
```
Both readers ultimately create a `StreamDecoder` that is used to read and
decode the input. However, they use different constructors:
- `reader1` calls the constructor with a `CharsetDecoder` created from the
`Charset` using `newDecoder()`
- `reader2` calls the constructor with the `Charset` which `StreamDecoder`
then converts
into a `CharsetDecoder` using
`newDecoder().onMalformedInput(CodingErrorAction.REPLACE).onUnmappableCharacter(CodingErrorAction.REPLACE))`
The result is that `reader1` will throw an Exception when facing invalid
input while `reader2` will silently "fix" that invalid input using
"replacement chars".
Which brings me to my questions:
1. Should the 2 approaches not behave identical by default?
2. Is there a way to use the first approach but end up with the same error
behavior as the second approach? One possible way would be to create an
overloaded `Files.newBufferedReader` which takes a `CharsetDecoder` as
second parameter.
More information about the jdk-dev
mailing list