UTF-16 파일로 인코딩 된 (일본어) 파일을 읽으려고합니다. 나는의 캐릭터와 함께하는 InputStreamReader를 사용하여 읽을 때Java Charset InputStreamReader, 파일 채널 차이점
'UTF-16 "파일을 제대로 읽어 : 나는 바이트 배열에서 파일 채널을 사용하고 읽을 때
try {
InputStreamReader read = new InputStreamReader(new FileInputStream("JapanTest.txt"), "UTF-16");
BufferedReader in = new BufferedReader(read);
String str;
while((str=in.readLine())!=null){
System.out.println(str);
}
in.close();
}catch (Exception e){
System.out.println(e);
}
그러나, 문자열은 때로 믿을 수' t 항상 올바르게 변환 :
File f = new File("JapanTest.txt");
fis = new FileInputStream(f);
channel = fis.getChannel();
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0L, channel.size());
buffer.position(0);
int get = Math.min(buffer.remaining(), 1024);
byte[] barray = new byte[1024];
buffer.get(barray, 0, get);
CharSet charSet = Charset.forName("UTF-16");
//endOfLinePos is a calculated value and defines the number of bytes to read
rowString = new String(barray, 0, endOfLinePos, charSet);
System.out.println(rowString);
나는 MappedByteBuffer 위치 0에있는 경우 나는 MappedByteBuffer의 위치를 증가하는 경우에만 문자를 올바르게 읽은 다음에 바이트 수를 읽을 수있는 내가 찾은 문제는 바이트 배열. charset UTF-16을 사용하면 바이트가 올바르게 변환되지 않습니다. 파일이 UTF-8로 인코딩 된 경우이 문제가 발생하지 않았으므로이 문제는 UTF-16에서만 발생합니다.
자세한 내용 : 파일 채널의 모든 행을 읽을 수 있어야하므로이 행 끝 바이트 위치 목록을 작성한 다음 해당 위치를 사용하여 지정된 바이트 수를 얻을 수 있습니다 줄로 변환 한 다음 문자열로 변환하십시오.
아마도 'endOfLinePos'가 잘못 계산됩니다. 홀수 인 경우 UTF-16에서 짝수 바이트가 필요하기 때문에 문제가됩니다. – irreputable
1024 자 그룹이 "가운데"에서 UTF-16 문자를 분할하고있는 것으로 의심됩니다. –