Java IO가 깨졌을 경우 어떻게 해야 하나요? Java의 IO 및 중국어 왜곡 문제
이런 블로그를 처음 올리는 것이기 때문에 어떻게 시작해야 할지 고민하고 있습니다. 바로 본론으로 가서 간단한 학습 경험을 기록해 보겠습니다. 첫째, 속도를 늦추기를 바라면서 천천히, 끈질기게 노력하면 앞으로는 더 훌륭하고 의미 있는 내용을 쓸 수 있을 것입니다.
사실 회사에서는 개발의 편의를 위해 파일 인코딩을 통일했기 때문에 한자가 깨져서 문제가 많이 발생하지 않습니다. 하지만 그 원리에 대해 조금은 이해할 필요가 있다고 생각합니다.
추천: "java learning"
IO는 입력 및 출력 스트림 객체 지향 용어로 이해하면 주로 파일 객체를 작동하는 데 사용되는 입력 및 출력 스트림 객체입니다. 그럼 파일의 개념, 즉 파일객체(File Object)에 대해 조금 이야기해보겠습니다. Java에서 File은 일상생활에서 참조하는 특정 파일이 아니라 경로 객체입니다. 예를 들어 File file=new File("D:\aaa"); 폴더에는 경로가 존재하지 않을 수도 있지만 이 코드는 실제로 경로를 나타내는 File 객체를 생성합니다. 이런 글쓰기 방식은 일반적으로 사용되지 않습니다. File f=new File("aaa.txt");
위에서 IO와 File이 무엇인지 간략하게 언급한 후 이 그림에 대해 이야기해 보겠습니다. 텍스트, 비디오 및 기타 정보는 당사의 저장 장치에 저장됩니다.
개인적인 이해로는 어떤 파일이든 바이너리 형식으로 저장되는데 최소 단위는 8비트 01로 구성됩니다. 따라서 파일을 복사하려면 바이트 스트림만 조작하면 됩니다. 즉, 한 파일의 모든 바이트를 가져와서 다른 파일에 쓰는 것이 실제로 이론적으로는 가능하지만 이러한 유형의 문자 파일의 경우에는 가능합니다. 오히려 특별해요.
이것이 한자가 깨져서 문제가 되는 이유입니다. ASCII 코드표는 누구나 들어본 적이 있을 정도로 아주 초기에 등장한 코드표라고 봐야 합니다. 처음에는 26개의 영문자와 일부 특수 기호만 사용했습니다. 바이너리를 인식하므로 코드 테이블을 구성하려면 문자를 해당 바이트로 대체해야 합니다.)
그러나 컴퓨터가 발전함에 따라 ASCII만으로는 충분하지 않을 수 있으며 많은 국가에서 자체 인코딩 체계가 있을 수 있으므로 다양한 인코딩 테이블이 등장했습니다. 일반적인 것은 GBK와 UTF-8이며, jvm에서 사용하는 기본 인코딩은 유니코드 인코딩이다. 즉, 2바이트가 한자를 표현하지만 반드시 UTF-8이 3바이트가 되어 한자를 표현하는 경우도 있다. , 또는 그 이상. 따라서 서로 다른 코드표에서 동일한 한자에 해당하는 바이트 코드의 수와 내용이 다른 문제가 발생합니다.
그럼 어떻게 해결하나요?
디스크 A에서 디스크 B로 사진을 복사할 때 A의 모든 바이트를 B로 가져오기만 하면 됩니다. 그러나 A와 B의 텍스트 인코딩이 동일해야 한다면 실제로 동일한 방식으로 텍스트를 작동하는 것이 가능합니다. 사진에는 바이트 인코딩 문제가 없기 때문입니다. 하지만 네트워크나 서버에서 중국어를 전송하려면 어떻게 해야 합니까? 단지 바이트만으로는 달성할 수 없습니다(문제가 발생할 경우 파일 인코딩을 수동으로 변경할 수 없기 때문입니다). 따라서 Java는 문자 왜곡 문제를 해결하기 위해 바이트 스트림에 인코딩 설정을 추가하는 문자 스트림 객체를 제공합니다.
더 이상 고민하지 않고 몇 가지 작은 사례를 사용하여 설명하겠습니다.
1 먼저 현재 프로젝트에서 aa.txt 및 bb.txt를 만듭니다. aa에 한자 몇개만 적어주세요. 두 가지 방법 모두
a, 문자 스트림
FileReader fr=new FileReader("aa.txt"); FileWriter fw=new FileWriter("bb.txt"); int c; while((c=fr.read())!=-1){ fw.write(c); } fr.close(); fw.close();
b, 바이트 스트림
FileInputStream fis=new FileInputStream("aa.txt"); FileOutputStream fos=new FileOutputStream("bb.txt"); int b; while((b=fis.read())!=-1){ fos.write(b); } fis.close(); fos.close();
2를 사용하여 구현할 수 있습니다. 이때 aa의 인코딩 방법이 UTF-8이면 인코딩을 변경합니다. bb GBK를 살펴보겠습니다. 위의 두 메소드를 동일하게 실행하면 모든 문자가 깨집니다.
이유는 두 파일의 인코딩 방식이 다르기 때문에 중국어 코드표가 달라서 코드가 깨졌기 때문입니다.
3 따라서 두 파일의 인코딩 방법이 다른 경우 읽고 쓸 때 파일에 해당하는 인코딩을 지정할 수 있습니다.
구현은 다음과 같습니다.
InputStreamReader isr=new InputStreamReader(new FileInputStream("aa.txt"),"utf-8"); OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("bb.txt"),"gbk"); char[] arr=new char[1024]; int len; while((len=isr.read(arr))!=-1){ String s=new String(arr,0,len); System.out.println(s); osw.write(s); } isr.close(); osw.close();
코드는 매우 간단하지만 간단히 설명하자면 API에서 InputStreamReader와 OutputStreamWriter는 모두 문자에 대해 작동하는 개체임을 알 수 있습니다.
주로 바이트를 문자로, 문자를 바이트로 변환하는 데 사용됩니다. 따라서 전달된 것이 바이트 스트림 객체라는 구성에서도 알 수 있습니다. UTF-8을 사용하여 바이트 스트림을 읽고 문자로 변환한 다음 문자를 gbk 인코딩으로 변환하여 바이트로 씁니다.
다음 줄은 설명하지 않으며 모두 기본 방법입니다. 구성에 전달되는 것은 익명의 내부 클래스 객체와 장식적인 디자인 패턴입니다. 이 작성 방법을 간단히 이해할 수 있습니다.
실제로 BufferedInputStream, BufferedReader 등과 같이 바이트 스트림과 문자 스트림에 유용한 클래스가 많이 있습니다. 이에 대해서는 다시 자세히 설명하지 않겠습니다.
jvm 및 시스템 플랫폼의 코딩 문제에 대해서는 여기서 설명하지 않겠습니다.
String으로 시도해 보고 컴파일 및 런타임 중에 문자열의 바이트코드 및 인코딩 문제를 관찰할 수 있습니다.
위 내용은 Java IO가 깨졌을 경우 어떻게 해야 할까요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!