Ich habe eine Textdatei, die ungültige "UTF-8" -Charakter enthält und dies verursacht meine App MalformedInputException
zu werfen. Ich verwende Files.newBufferedReader
, um BufferReader
zu erstellen.IO bufferReader vs nio Files.newBufferedReader CharsetDecoder Nachsicht auf MalformedInput
Path path = FileSystems.getDefault().getPath(inputDirectory, fileName);
BufferedReader br = Files.newBufferedReader(path, Charset.defaultCharset());
Und dies scheint auf die Zeichencodierung streng zu sein. Ich habe etwas graben und online gefunden, dass wir die Nachsicht verbessern können, indem wir die Standardaktion CharactorDecoder
durch .onMalformedInput(CodingErrorAction.REPLACE)
überschreiben. Dies scheint das Problem zu beheben.
Dann aus Neugier habe ich Java IO BufferedReader
verwendet, um die gleiche Datei zu lesen.
fr = new FileReader(file);
br = new BufferedReader(fr);
Dies scheint kein Problem auf dem ungültigen Zeichen zu haben und die Datei ohne Ausgabe zu lesen.
So sah ich den Code sowohl von Files.newBufferedReader
und new BufferedReader(fr)
. Dies ist, wie sie beide
Files.newBufferedReader:
public static BufferedReader newBufferedReader(Path path, Charset cs)
throws IOException
{
//onMalformedInput is not overridden. Thus strict decoding
CharsetDecoder decoder = cs.newDecoder();
//Look at how the InputStreadReader created. The decoder being passed
Reader reader = new InputStreamReader(newInputStream(path), decoder);
return new BufferedReader(reader);
}
IO BuffereReader
//Creating File Reader
FileReader fr = new FileReader(file);
--------------------------------------------------------------------
//File Reader constructor
public FileReader(File file) throws FileNotFoundException {
//Calls it's supper constructor InputStreamReader
super(new FileInputStream(file));
}
-----------------------------------------------------------
//InputStreamReader Constructor
public InputStreamReader(InputStream in) {
super(in);
try {
//This where I don't understand
sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## check lock object
} catch (UnsupportedEncodingException e) {
throw new Error(e);
}
}
Wie Sie sie beide verwendet StreamDecoder.forInputStreamReader
sehen können. Ich weiß, warum Files.newBufferedReader
hat strenge Decoder. Aber ich versuche zu verstehen, wo in IO BufferredReader
, ist es definiert, um milde Decodierung zu tun.
Würde mich wirklich freuen, wenn einige mir helfen können, dies zu verstehen.