Wygląda na to, że Files.newBufferedReader()
jest bardziej rygorystyczna pod względem UTF-8 niż naiwna alternatywa.Różne wyniki odczytu pliku za pomocą Files.newBufferedReader() i konstruowanie czytelników bezpośrednio
Jeśli utworzyć plik za pomocą jednego bajta 128 --- tak, to nie jest poprawnym UTF-8 znaków --- to chętnie się czytać gdybym skonstruować BufferedReader
na InputStreamReader
na skutek Files.newInputStream()
, ale z Files.newBufferedReader()
Wyjątek jest zgłaszany.
Ten kod
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());
}
ma ten wynik:
�
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)
Czy to udokumentowane? I czy można uzyskać łagodne zachowanie z Files.newBufferedReader()
?
Dziki stab w ciemności, ale próbowałeś określający kodowanie znaków w newBufferedReader zadzwonić? – JustinKSU
@JustinKSU Nie powinien. Ta metoda jest [udokumentowana] (http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#newBufferedReader-java.nio.file.Path-) jako użycie UTF- 8. – VGR