2017-02-04 2 views
0

잘못된 "UTF-8"문자가 포함 된 텍스트 파일이 있는데 이로 인해 내 응용 프로그램이 MalformedInputException을 throw합니다. 저는 Files.newBufferedReader을 사용하여 BufferReader을 만듭니다.IO bufferReader 대 n Files.newBufferedReader MalformedInput의 CharsetDecoder 관용

Path path = FileSystems.getDefault().getPath(inputDirectory, fileName); 
BufferedReader br = Files.newBufferedReader(path, Charset.defaultCharset()); 

그리고 이것은 문자 인코딩에 엄격한 것으로 보입니다. 나는 약간의 파고를했고 온라인에서 에 의해 CharactorDecoder 기본 행동을 무시함으로써 관대함을 향상시킬 수 있다고 판단했다. 이것은 문제를 해결하는 것 같습니다.

다음 호기심 때문에 나는 같은 파일을 읽기 위해 java IO BufferedReader을 사용했다.

fr = new FileReader(file); 
br = new BufferedReader(fr); 

이것은 잘못된 문자에 아무런 문제가 없으며 어떤 문제없이 파일을 읽을 것 같다.

그럼 코드 Files.newBufferedReadernew BufferedReader(fr)을 살펴 보았습니다. 당신은 그들이 모두 StreamDecoder.forInputStreamReader를 사용하여 볼 수 있듯이

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); 
    } 
} 

: 이것은 그들이 모두

Files.newBufferedReader을 구현하는 방법이다. 왜 Files.newBufferedReader에 엄격한 디코더가 있는지 압니다. 그러나 나는 IO의 어느 부분이 관대 한 디코딩을 수행 할 것인지에 대해 이해하려고 노력하고 있습니다.

이것을 이해하는 데 도움이 될만한 사람이 있으면 정말 감사하겠습니다.

답변

0

관대 한 디코딩은 실제로는 FileReader으로 수행되어야합니다. 이것을 지정하는 문서의 어떤 부분도 찾을 수 없지만 코드를 파고 들자면 onMalformedInput(CodingErrorAction.REPLACE)을 사용합니다. 모든 JDK 구현에서 동일한 방식으로 신뢰할 수 있는지 확실하지 않습니다.