이 기사는 참조를 위해 Java의 문자 스트림과 바이트 스트림의 차이를 분석합니다. 특정 내용은 다음과 같습니다
1. 흐름이란 무엇입니까?
Java의 스트림은 바이트 시퀀스의 추상화입니다. 우리는 수관이 있다고 상상할 수 있지만 이제는 더 이상 수도관에서 물이 흐르지 않고 바이트 시퀀스가 있습니다. 물의 흐름과 마찬가지로 Java의 개울은 "흐름 방향"도 있습니다. 바이트 시퀀스를 읽을 수있는 객체를 입력 스트림이라고합니다. 바이트 시퀀스가 작성되는 객체를 출력 스트림이라고합니다.
2. 바이트 스트림
Java에서 바이트 스트림 처리의 가장 기본적인 단위는 단일 바이트이며 일반적으로 이진 데이터를 처리하는 데 사용됩니다. Java에서 가장 기본적인 바이트 스트림 클래스는 입력 스트림 및 출력 스트림이며, 이는 각각 기본 입력 바이트 스트림 및 출력 바이트 스트림 그룹을 나타냅니다. InputStream 클래스와 OutputStream 클래스는 모두 추상 클래스입니다. 실제로 사용하면 일반적으로 Java 클래스 라이브러리에 제공된 일련의 서브 클래스를 사용합니다. 입력 스트림 클래스를 예로 들어 Java에서 바이트 스트림을 소개하겠습니다.
입력 스트림 클래스는 바이트 스트림에서 바이트를 읽기위한 기본 메소드를 정의합니다. 이 방법의 정의는 다음과 같습니다.
공개 초록 int read ()는 ioexception을 던졌습니다.
이것은 추상적 인 방법, 즉 입력 스트림에서 파생 된 입력 바이트 스트림 클래스 가이 방법을 구현해야합니다. 이 방법의 기능은 바이트 스트림에서 바이트를 읽고 끝에 도달하면 -1을 반환하는 것입니다. 그렇지 않으면 읽기 바이트를 반환합니다. 이 방법에 대해 주목해야 할 것은 읽기 바이트 또는 -1을 계속 차단하고 반환한다는 것입니다. 또한 바이트 스트림은 기본적으로 캐싱을 지원하지 않습니다. 즉, 읽기 메소드가 호출 될 때마다 운영 체제는 운영 체제에 One Byte를 읽도록 요청합니다. 일부 친구는 매개 변수로 바이트 배열을 가진 입력 스트림 클래스에서 과부하 된 읽기 방법이 자주 디스크 IO없이 한 번에 여러 바이트를 읽을 수 있다고 생각할 수 있습니다. 그래서 이것이 사실입니까? 이 방법의 소스 코드를 살펴 보겠습니다.
public int read (byte b [])는 ioexception {return read (b, 0, b.length);} 던지기다른 버전의 읽기 과부하 메소드를 호출하므로 계속합니다.
public int read (byte b [], int off, int len)는 ioexception {if (b == null) {throw new nullpointerexception (); } else if (off <0 || len <0 || len> b.length -off) {새 IndexoutofBoundsexception (); } else if (len == 0) {return 0; } int c = read (); if (c == -1) {return -1; } b [off] = (바이트) c; int i = 1; try {for (; i <len; i ++) {c = read (); if (c == -1) {break; } b [off + i] = (바이트) c; }} catch (ioexception ee) {} return i; }위의 코드에서 실제로 read (byte []) 메소드는 루프를 사용하여 read () 메소드를 호출하여 바이트 배열 "한 번에"로 읽습니다.이 메소드는 메모리 버퍼를 사용하지 않습니다. 메모리 버퍼를 사용하여 읽기 효율을 향상 시키려면 BufferedInputStream을 사용해야합니다.
3. 캐릭터 스트림
Java에서 가장 기본적인 문자 스트림 처리 단위는 유니 코드 기호 (크기 2 바이트)이며, 일반적으로 텍스트 데이터를 처리하는 데 사용됩니다. 소위 유니 코드 기호는 0x0000 ~ 0xffff 범위의 유니 코드 코드 유닛입니다. 위 범위의 각 숫자는 문자에 해당합니다. Java의 문자열 유형은 기본적으로 유니 코드 규칙으로 문자를 인코딩 한 다음 메모리에 저장합니다. 그러나 메모리에 저장된 것과 달리 디스크에 저장된 데이터에는 일반적으로 다양한 인코딩 방법이 있습니다. 다른 인코딩 방법을 사용하면 동일한 문자마다 다른 이진 표현이 있습니다. 실제로 캐릭터 스트림은 다음과 같이 작동합니다.
출력 문자 스트림 : 지정된 인코딩 메소드 하에서 문자 시퀀스 (실제로 유니 코드 심볼 시퀀스)를 바이트 시퀀스로 변환 한 다음 파일로 씁니다.
입력 문자 스트림 : 메모리에 저장 될 수 있도록 지정된 인코딩 방법에서 해당 문자 시퀀스 (실제로 유니 코드 심볼 시퀀스)로 읽을 바이트 시퀀스를 디코딩합니다.
우리는 데모를 사용 하여이 과정에 대한 이해를 심화시킵니다. 샘플 코드는 다음과 같습니다.
import java.io.filewriter; import java.io.ioexception; public class filewriterdemo {public static void main (String [] args) {filewriter filewriter = null; try {try {filewriter = new filewriter ( "demo.txt"); filewriter.write ( "데모"); } 마침내 {filewriter.close (); }} catch (ioexception e) {e.printstacktrace (); }}}위의 코드에서는 filewriter를 사용하여 4 개의 문자 "데모"를 Demo.txt에 작성합니다. 우리는 16 진 편집기 Winhex를 사용하여 demo.txt의 내용을보십시오.
위 그림에서 볼 수 있듯이, 우리가 쓴 "데모"는 "64 65 6d 6f"로 인코딩되지만 위의 코드에서 인코딩 메소드를 명시 적으로 지정하지는 않습니다. 실제로, 우리가 지정하지 않을 때, 운영 체제의 기본 문자 인코딩 메소드는 쓰고 싶은 문자를 인코딩하는 데 사용됩니다.
문자 스트림은 실제로 출력 전에 유니 코드 심볼 시퀀스를 해당 인코딩 메소드로 변환해야하므로 메모리 버퍼를 사용하여 변환 된 바이트 시퀀스를 저장하고 디스크 파일에 함께 쓰기 전에 변환이 완료 될 때까지 기다립니다.
4. 문자 스트림과 바이트 스트림의 차이
위의 설명 후에는 바이트 스트림과 문자 스트림의 주요 차이점이 다음 측면에 반영된다는 것을 알 수 있습니다.
바이트 스트림 작동의 기본 단위는 바이트입니다. 문자 스트림 작동의 기본 단위는 유니 코드 기호입니다.
기본적으로 바이트 스트림은 버퍼를 사용하지 않습니다. 문자 스트림은 버퍼를 사용합니다.
바이트 스트림은 일반적으로 이진 데이터를 처리하는 데 사용됩니다. 실제로 모든 유형의 데이터를 처리 할 수 있지만 유니 코드 기호를 직접 쓰거나 읽는 것을 지원하지는 않습니다. 문자 스트림은 일반적으로 텍스트 데이터를 처리하며, 이는 유니 코드 기호를 쓰고 읽는 것을 지원합니다.
위의 것은 Java의 캐릭터 스트림과 바이트 스트림에 대한 나의 이해 중 일부입니다. 불분명하거나 부정확 한 설명이 있으면 수정할 수 있기를 바랍니다. 감사합니다.