2017-02-04 4 views
0

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

implementiert

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.

Antwort

0

Die milde Decodierung sollte eigentlich von FileReader durchgeführt werden. Ich kann keinen Teil der Dokumentation finden, die dies spezifiziert, aber in seinen Code gräbt, verwendet es auch onMalformedInput(CodingErrorAction.REPLACE). Ich bin mir nicht sicher, ob es sich bei allen JDK-Implementierungen um dieselbe Methode handelt.