자바 파일 읽 기 쓰기 인 코딩 문제
내. 부호화---> 눈.
용모 <<----디 코딩 표.
인 코딩 디 코딩 은 번역 언어 와 같다.내용 은 본질 적 인 것 이 므 로 아무리 인 코딩 을 해도 표현 하 는 내용 은 변 할 수 없다.
그러나 아무리 인 코딩 을 해도 표현 형식 은 바이트 배열 이 고 그 값 은 인 코딩 디 코딩 방식 에 따라 다르다.
인 코딩 디 코딩 을 하려 면 이 byte 배열 을 조작 하여 우리 가 필요 로 하 는 내용 으로 복원 하 는 것 입 니 다.
한자 의 인 코딩 디 코딩 에 대해 한자 자체 가 내용 파일 입 니 다.우 리 는 그들 을 숫자 로 표시 해 야 합 니 다.즉,해당 하 는 바 이 너 리 문자열(목표)로 인 코딩 해 야 합 니 다.
일반적인 문자 집합:
ANSI:ASCII 문자 집합 과 이 로 인해 파생 되 고 호 환 되 는 문자 집합,예 를 들 어 GB 2312(한자 지원,GB 는'국가 표준'의 줄 임 말),GB 2312 에서 아래로 호 환 되 는 GBK(그 중에서 표현 할 수 있 는 한자 수량 이 GB 2312 보다 많다),정식 명칭 은 MBCS(Multi-Byte)이다. Chactacter System,다 중 바이트 문자 시스템)은 일반적으로 ANSI 문자 집합 이 라 고도 부른다.
UNICODE: 모든 언어 가 자신의 문자 집합 을 제 정 했 기 때문에 마지막 에 존재 하 는 각종 문자 집합 이 너무 많아 국제 교류 에서 문자 집합 을 자주 바 꾸 는 것 이 매우 불편 하 다.그래서 유 니 코드 문자 집합 이 생 겼 습 니 다.16 을 고정 적 으로 사용 합 니 다. bits(두 바이트)는 한 문 자 를 표시 하고 모두 65536 문 자 를 표시 할 수 있 습 니 다.표준 유 니 코드 는 UTF-16(UTF:UCS)이 라 고 합 니 다. Transformation Format,두 바이트 마다 인 코딩 유닛 으로 인 코딩 효율 이 높 습 니 다.이것 은 한 바이트 로 저장 할 수 있 는 ASCII 문자 로 한 바 이 트 를 낭비 하여 네트워크 전송 에 적합 하지 않 고 로 컬 인 코딩 에 많이 사용 합 니 다).그 후에 두 바이트 의 유 니 코드 가 기 존의 단일 바이트 처리 시스템 에서 정확하게 전송 되 기 위해 UTF-8(긴 인 코딩 으로 더 좋 은 노 스틱 성 이 나 타 났 다.UTF 16 순서 인 코딩 은 중간 에 bit 비트 비트 를 잃 어 버 리 면 전체 판 을 지 는 것 이지 만 UTF 8 의 인 코딩 방식 에서 모든 단원 은 특정한 비트 비트 비트 비트 비트 비트 의 머리 를 가지 고 있어 서 이런 상황 에 저항 할 수 있다).유 니 코드 를 MBCS 와 유사 한 방식 으로 인 코딩 합 니 다.(유 니 코드 문자 집합 은 여러 가지 인 코딩 형식 이 있 습 니 다)
************본문*******************************
자바 에서 파일 을 읽 는 디 코딩
파일 은 바이트 형식 으로 디스크 에 저 장 됩 니 다.이 데 이 터 는 실제 파일 의 내용 이 특정한 문자 집합 을 통 해 인 코딩 된 결과 입 니 다.파일 을 읽 은 후에 파일 에 대한 처 리 는 바로 이 데이터 에 대한 디 코딩 입 니 다.
자바 IO 의 프레임 워 크 에 따라 자바 가 파일 을 읽 는 방식 은 전체적으로 두 가지 로 나 눌 수 있 습 니 다.바이트 로 읽 고 문자 로 읽 습 니 다.다음은 순서대로 분석 하 겠 습 니 다.
바이트 로 읽 기
바이트 에 따라 읽 는 계층 구 조 는 각종 stream 입 니 다.InputStream.read()방법 으로 바 이 트 를 읽 을 수 있 습 니 다.필요 하 다 면 바이트 배열 을 String 문자열 로 변환 할 수 있 습 니 다.
인 코딩 도 바이트 배열 에서 문자열 배열 로 전환 하 는 과정 에서 발생 한다.
String str = new String(byteArray);
String 구조 함수 doc 참조 , 위의 변환 은 실제로 시스템 의 기본 문자 집합 을 사용 합 니 다.문자 집합 디 코딩 이 필요 하 다 면 사용 할 수 있 습 니 다
String(byte[] bytes, Charset charset)
구조 함수.파일 의 인 코딩 문자 집합 으로 디 코딩 할 수만 있다 면,난 코딩 문제 가 발생 하지 않 을 것 이다.
다음은 실천 코드.나 는 a.txt 를 나의 사용자 디 렉 터 리 에 저장 했다.내용: 질문
package biaobiaoqi.thinkingInJava;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test {
public static void main(String[] args){
try {
FileInputStream in = new FileInputStream("/home/biaobiaoqi/a.txt");
byte[] bytes = new byte[100];
while((in.read(bytes)) != -1);
in.close();
String strGB2312 = new String(bytes,"GB2312");
String strGBK = new String(bytes,"GBK");
String strUTF8 = new String(bytes,"UTF-8");
String strUTF16 = new String(bytes,"UTF-16");
System.out.println("strGB2312: "+strGB2312);
System.out.println("strGBK: "+strGBK);
System.out.println("strUTF8: "+strUTF8);
System.out.println("strUTF16: "+strUTF16);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
각각 GB 2312,GBK,UTF 8,UTF 16 을 사용 하고 system.out.println 으로 표시 한 결 과 는 다음 과 같다.
strGB2312: biaobiaoqi
strGBK: biaobiaoqi
strUTF8: biaobiaoqi��������
strUTF16: 뇠싫컊쳢
a.txt 의 텍스트 파일 인 코딩 은 ANSI 이 고 GBK 는 GB 2312 를 아래로 호 환 하기 때문에 둘 다 표시 할 수 있 습 니 다.UTF 는 그리 순 조 롭 지 못 했다.
문자 로 읽 기
문자 로 읽 는 차원 체계(각종 Reader,Writer 류)의 출현 은 국제 화(thinking in java)에 적응 하기 위 한 것 이다.서로 다른 언어의 서로 다른 문자 집합 이 문자 에 대한 처 리 는 다르다.
실제로 앞서 소개 한 btye 숫자 를 String 으로 변환 하 는 과정 은 리더 들 이 해 야 할 일이 다.그들 은 바이트 읽 기 클래스 를 바탕 으로 바이트 배열 을 해당 문자 집합 문자열 로 변환 했다.
방법 은 다음 과 같다.
InputStreamReader in = new InputStreamReader(new FileInputStream(“demo.txt”),”UTF-8”);
두 번 째 인 자 를 지정 하지 않 으 면 시스템 의 기본 문자 집합 인 코딩 도 사용 합 니 다.
출력 파일 인 코딩
같은 이치 로 파일 을 출력 할 때 인 코딩 문제 가 발생 할 수 있다.
바이트 출력 흐름
인 코딩 이 아 닌 바이트 형식 이기 때문에 파일 로 직접 저 장 됩 니 다.인 코딩 은 문자열 에서 바이트 배열 까지 완료 되 었 습 니 다.
그렇다면 문자열 에서 바이트 배열 로 전환 하 는 인 코딩 은 어떻게 제어 합 니까?
일반적인 경우 String 의 getByte()방법 을 사용 합 니 다.String 의 구조 와 마찬가지 로 인 자 를 추가 하지 않 으 면 시스템 의 기본 문자 집합 인 코딩 을 사용 합 니 다.사용자 정의 인 코딩 방식 은 byte[]getByte(Charset c)입 니 다.
String str = " ,biaobiaoqi";
FileOutputStream out = new FileOutputStream("/home/biaobiaoqi/b.txt");
out.write(str.getBytes("UTF-16"));
out.close();
문자 출력 흐름
이치 가 같다.그의 밑바닥 도 바이트 출력 흐름 을 이용 하여 실현 되 었 다.Output StreamWriter 동작 은 다음 과 같 습 니 다.
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(“dd.txt”),”UTF-8”);
더욱 깊이 있 게 연구 한 결과 콘 솔 에서 의 디 스 플레이 도 인 코딩 디 코딩 문 제 를 이용 해 야 한 다 는 것 을 알 수 있다.
시스템.out.println 에 서 는 시스템 의 기본 인 코딩 을 사용 합 니 다.console 에 서 는 다른 문자 집합 디 코딩 을 사용 하면 디 코딩 문제 가 발생 할 수 있 습 니 다.
Eclipse 에서 console 에 표 시 된 디 코딩 문자 집합 을 수정 할 수 있 습 니 다.Run configuration-->common,수정 하면 system.out.println 이후 에 오류 가 발생 할 것 이 라 고 믿 습 니 다^ ^
한 마디 로 하면 인 코딩 과 디 코딩 이 통일 되 기만 하면 통 일 된 자바 플랫폼 에서 난 장 판이 발생 하지 않 을 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.