Sembra che lo standard Files.newBufferedReader()
sia più rigido rispetto a UTF-8 che l'alternativa ingenua.Diversi file di lettura dei risultati con Files.newBufferedReader() e costruzione diretta dei lettori
Se creo un file con un singolo byte 128 --- quindi, non è un carattere valido UTF-8 --- che verrà felicemente essere letto se io costruisco un BufferedReader
su un InputStreamReader
sul risultato di Files.newInputStream()
, ma con Files.newBufferedReader()
viene generata un'eccezione.
Questo codice
try (
InputStream in = Files.newInputStream(path);
Reader isReader = new InputStreamReader(in, "UTF-8");
Reader reader = new BufferedReader(isReader);
) {
System.out.println((char) reader.read());
}
try (
Reader reader = Files.newBufferedReader(path);
) {
System.out.println((char) reader.read());
}
ha questo risultato:
�
Exception in thread "main" java.nio.charset.MalformedInputException: Input length = 1
at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.read(BufferedReader.java:182)
at TestUtf8.main(TestUtf8.java:28)
È questo documentato? Ed è possibile ottenere il comportamento clemente con Files.newBufferedReader()
?
pugnalata selvaggio nel buio, ma hai provato a specificare charset nel newBufferedReader chiamare? – JustinKSU
@JustinKSU Non avrebbe dovuto. Questo metodo è [documentato] (http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#newBufferedReader-java.nio.file.Path-) come se si utilizzasse UTF- 8. – VGR