"스트림"이라는 개념은 UNIX의 파이프 개념에서 유래되었습니다. UNIX에서 파이프는 프로그램이나 프로세스 간의 통신을 구현하거나 주변 장치, 외부 파일 등을 읽고 쓰는 데 사용되는 중단 없는 바이트 스트림입니다. 실제 I/O 장치에서 데이터 처리의 세부 사항을 보호합니다. 스트림에는 소스와 대상이 있어야 하며, 이는 컴퓨터 메모리의 특정 영역, 디스크 파일 또는 인터넷의 URL일 수도 있습니다. 흐름의 방향이 중요합니다. 흐름의 방향에 따라 흐름은 입력 흐름과 출력 흐름의 두 가지 범주로 나눌 수 있습니다. 사실 입출력은 메모리를 위한 것입니다. 실제로 스트림의 소스와 대상은 단순히 바이트의 생산자와 소비자로 간주될 수 있습니다. 입력 스트림의 경우 단순히 스트림에서 데이터를 읽는 한 소스에 대해 신경 쓸 필요가 없습니다. 입력 스트림의 경우 출력 스트림도 대상을 인식하지 못하고 단순히 스트림에 데이터를 쓸 수 있습니다.
a. 스트림: 순서가 지정된 데이터 시퀀스 집합입니다.
b 바이트 스트림: 데이터 스트림의 가장 작은 데이터 단위는 바이트입니다.
c. 문자 스트림: 데이터 스트림에서 가장 작은 데이터 단위는 문자입니다.
1. java.io 패키지의 클래스는 두 가지 유형의 스트림에 해당합니다.
한 가지 유형의 스트림은 지정된 위치(예: 디스크 파일 또는 메모리 영역)에서 직접 읽거나 씁니다. 이러한 유형의 스트림을 노드 스트림이라고 하며 다른 스트림을 필터 스트림(패키징 스트림)이라고 합니다.
스트림 필터링: 일부 스트림은 파일 및 다른 곳에서 바이트를 수신할 수 있고 다른 스트림은 바이트를 보다 유용한 데이터 유형으로 결합할 수 있습니다. 기존 스트림을 다른 스트림에 전달하고 두 스트림을 결합하는 생성자를 필터링된 스트림이라고 합니다. 필터 입력 스트림은 다른 입력 스트림을 입력 소스로 사용하는 경우가 많습니다. 필터링 또는 처리 후에는 필터 출력 스트림과 유사하게 사용자에게 제공됩니다. 우리는 흐름 객체를 생성하기 위해 단일 클래스를 거의 사용하지 않지만 대신 여러 객체를 오버레이하여 원하는 기능을 제공합니다(예: 데코레이터 디자인 패턴).
Java에서 일반적으로 사용되는 입력 및 출력 스트림은 실제로 다음과 같은 네 가지 추상 클래스에서 상속됩니다.
단일 바이트 InputStream, OutputStream 클래스(바이트 중심 I/O) 기반
2바이트 유니코드 코드 단위(문자 중심 I/O)를 기반으로 하는 판독기 및 기록기 클래스
입력 스트림이 열리면 프로그램은 입력 스트림에서 데이터를 직렬로 읽을 수 있습니다. 입력 스트림에서 데이터를 읽고 쓰는 프로세스는 일반적으로 다음과 같습니다. 스트림 채널 열기 --> 정보 읽기/쓰기 --> 스트림 채널 닫기.
Java 플랫폼에는 로컬 플랫폼의 문자 인코딩 유형을 얻는 두 가지 방법이 있습니다.
(a) System.getProperty("file.encoding");
(b) Charset cs=Charset.defaultCharset();
모든 입력 스트림과 출력 스트림은 바이트(입력, 출력) 스트림과 문자(입력, 출력) 스트림으로 나눌 수 있다. 바이트를 처리하는 것은 주로(OutputStream/InputStream) 계열이고, 문자를 처리하는 것은 주로(Reader/Write)이다. ) 시리즈
2. 바이트 지향 입력 스트림(InputStream 시리즈), 이러한 클래스는 FileInputStream 객체에 연결되어 유용한 인터페이스를 제공할 수 있습니다.
ByteArrayInputStream: 메모리의 버퍼를 InputStream으로 사용합니다.
StringBufferInputStream(java1.1에서는 더 이상 사용되지 않음): String 객체를 InputStream으로 사용하고 기본 구현에서는 StringBuffer를 사용합니다.
FileInputStream: 파일 읽기 작업을 구현하기 위해 파일을 InputStream으로 사용합니다(파일 이름, 파일, FileDescriptor 개체).
PipedInputStream: 주로 스레드에서 사용되는 파이프 개념을 구현합니다(여러 프로세스의 데이터 소스로).
SequenceInputStream: 여러 개의 입력 스트림을 하나의 입력 스트림으로 결합합니다.
바이트 지향 출력 스트림(OutputStream 시리즈)을 FilterOutputStream 객체에 연결하여 유용한 인터페이스를 제공할 수 있습니다.
ByteArrayOutputStream: 메모리에 버퍼를 생성하고, 메모리의 버퍼에 정보를 저장하고, 버퍼 크기를 초기화합니다(선택 사항).
FileOutputStream: 정보를 파일에 저장합니다(파일 이름, 파일, FileDescriptor).
PipedOutputStream: 스레드에서 주로 사용되는 파이프 개념을 구현합니다. (멀티 스레드의 경우 데이터의 대상을 지정합니다.)
3. 해당(리더/라이터) 시리즈 :
리더: InputStream에 해당, 어댑터 InputStreamReader
Writer: OutputStream에 해당하고 어댑터는 OutputStreamWriter입니다.
FileReader: FileOutputStream에 해당
FileWriter: FileOurputStream에 해당합니다.
StringReader: 해당 클래스가 없습니다.
StringWriter: ByteArrayInputStream에 해당
CharArrayReader: ByteArrayOutputStream에 해당
CharArrayWriter: ByteArrayOutputStream에 해당
PipedReader: PipedInputStream에 해당합니다.
PipedWriter: PipedOutputStream에 해당
4. 두 개의 무제한 스트림 간 변환( 어댑터 클래스 사용)
InputStreamReader 및 OutputStreamReader: 바이트 지향 스트림을 문자 지향 스트림으로 변환합니다.
InputStreamReader는 바이트 스트림에서 문자 스트림으로의 브리지입니다. 지정된 문자 세트를 사용하여 바이트를 읽고 이를 문자로 디코딩합니다. 사용하는 문자 세트는 이름으로 지정하거나 명시적으로 제공할 수 있으며, 플랫폼의 기본 문자 세트를 허용할 수도 있습니다.
OutputStreamWriter는 문자 스트림에서 바이트 스트림으로의 브리지입니다. 스트림에 기록될 문자는 지정된 문자 세트를 사용하여 바이트로 인코딩될 수 있습니다. 사용하는 문자 세트는 이름으로 지정하거나 명시적으로 제공할 수 있습니다. 그렇지 않으면 플랫폼 기본 문자 세트가 허용됩니다.
5. FilterInputStream을 통해 InputStream에서 데이터를 읽습니다 .
DataInputStream: 스트림에서 기본 유형(int, char, long 등) 데이터를 읽습니다.
BufferedInputStream: 매번 실제 읽기 작업을 수행하지 않아도 되도록 버퍼를 사용합니다.
LineNumberInputStream: 입력 스트림의 라인 수를 기록한 다음 getLineNumber() 및 setLineNumber(int)를 호출합니다.
PushbackInputStream: 거의 사용되지 않으며 일반적으로 컴파일러 개발에 사용됩니다.
FilterOutputStream을 통해 OutputStream에 쓰기:
DataIOutputStream: 이식 방식에 따라 기본형(int, char, long 등) 데이터를 스트림으로 출력할 수 있다.
BufferedOutputStream: 데이터를 보낼 때마다 실제 쓰기를 피하기 위해 버퍼를 사용합니다.
PrintStream: DataOutputStream이 데이터 저장을 처리하고 PrintStream이 표시를 처리하는 형식화된 출력을 생성합니다.
6. 스트림 동작 변경
BufferedOutputStream은 FilterOutputStream의 하위 클래스이지만 BufferedWriter는 FilterWriter의 하위 클래스가 아닙니다(FilterWriter는 추상 클래스이며 하위 클래스가 없습니다).
DataInputStream에 해당하는 클래스가 없습니다. readLine()을 사용하려는 경우 대신 BufferedReader를 사용하지 않는 한 DataInputStream을 사용하십시오.
BufferedReader: BufferedInputStream에 해당합니다.
LineNumberReader: LineNumberInputStream에 해당
PushBackReader: PushbackInputStream에 해당
BufferedWrite: BufferedOutStream에 해당합니다.
PrintWrite: PrintStream에 해당합니다.
7. 자체 독립적 클래스: RandomAccessFile
이 클래스는 알려진 크기의 레코드로 구성된 파일에 적합합니다. DataInput 및 DataOutput 인터페이스(DataInputStream 및 DataOutputStream도 이 두 인터페이스를 구현함)를 구현하는 것 외에도 RandomAccessFile은 본질적으로 다른 I/O 유형을 갖습니다. 다양한 동작이 가능하며 파일 내에서 앞뒤로 이동할 수 있으며 Object에서 직접 파생됩니다.
파일에 대한 읽기 및 쓰기 작업은 RandomAccessFile 개체를 통해 완료할 수 있습니다.
객체를 생성할 때 열려는 파일의 특성을 지정할 수 있습니다. r, 읽기 전용, w, 쓰기 전용;
파일의 지정된 위치로 직접 이동할 수 있습니다.
RandomAccessFile의 대부분(전부는 아님) 기능이 nio 스토리지 매핑 파일로 대체되었습니다.