잘못된 "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.newBufferedReader
과 new 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의 어느 부분이 관대 한 디코딩을 수행 할 것인지에 대해 이해하려고 노력하고 있습니다.
이것을 이해하는 데 도움이 될만한 사람이 있으면 정말 감사하겠습니다.