[JAVA] 입출력(I/O), 스트림(Stream), 버퍼(Buffer)

JoJo·2023년 7월 11일
0
post-custom-banner

참고 사이트
https://www.devkuma.com/docs/java/input-output-stream-reader-writer/


💡 입출력(I/O)


✔️ 입출력(I/O) 란?

Input 과 Output의 약자로, 컴퓨터 내부 또는 외부 장치와 
프로그램 간의 데이터를 주고 받는 것을 의미합니다.

장치와 입출력을 위해서는 하드웨어 장치에 직접 접근이 필요하고, 
다양한 매체에 존재하는 데이터를 사용하기 위해 입출력 데이터를 
처리 할 공통적인 방법으로 스트림을 이용합니다.


✔️ Java I/O 패키지란?

데이터 스트림, 직렬화 및 파일 시스템을 통한 시스템 입력 및 출력을 제공하는 패키지로, 
파일 입출력과 관련된 클래스들로 구성되어있습니다.
Java.io 패키지의 주요 클래스설명
File파일 시스템의 파일 정보를 얻기 위한 클래스
Console콘솔로부터 문자을 입출력하기 위한 클래스
InputStream/OutputStream바이트 단위 입출력을 위한 최상위 입출력 클래스
FileInputStream / FileOutputStream
DataInputStream / DataOutputStream
ObjectInputStream / ObjectOutputStream바이트 단위 입출력을 위한 하위 스트림 클래스
PrintStream
BufferedInputStream / BufferedOutputStream
Reader / Writer문자 단위 입출력을 위한 최상위 입출력 스트림 클래스
FileReader / FileWriter
InputStreamReader / OutputStreamReader문자 단위 입출력을 위한 하위 스트림 클래스
PrintWriter
BufferedReader / BufferedWriter



💡 스트림(Stream)


✔️ 스트림(Stream) 이란?

간단하게 말해서 자료의 입출력을 도와주는 중간매개체 입니다.

컬렉션, 배열 등에 저장된 요소들을 하나씩 참조하면서  코드를 실행할 수 있는 기능으로, 
입출력 장치에서 데이터를 읽고 쓰기 위해 제공하는 class이고 각각의 장치마다 
연결할 수 있는 스트림이 존재합니다., 하나의 스트림으로 입출력을 동시에 수행할 수 없고, 입출력을 동시에 수행하려면 
2개의 스트림이 필요합니다. (단방향 통신)



✔️ 스트림(Stream) 의 특징

🧷 스트림의 양 끝에 입출력 장치와 자바 응용프로그램 연결합니다.

🧷 입력과 출력을 동시에 하는 스트림은 없습니다!

🧷 입출력 스트림의 기본 단위

- 바이트 스트림 : byte
- 문자 스트림 : 문자 (자바에서는 문자 1-> 2바이트)

🧷 선입선출 구조



✔️ 스트림(Stream) 의 종류

🧷 문자 스트림

문자만 입출력하는 스트림으로, 문자가 아닌 바이너리 데이터는 스트림에서 처리하지 못합니다.

🧷 바이트 스트림

그림, 멀티미디어, 문자 등 모든 종류의 데이터를 받고 보낼 수 있습니다.



✔️ 문자열과 byte[] 전환

🧷 문자열 -> byte[]

getBytes() : 기본인코딩  기본인코딩 
getBytes("인코딩방식") : 인코딩방식으로

🧷 byte[] -> 문자열

new String(byte 배열);
new String(byte	배열, "인코딩 방식");



✔️ JDK의 바이트 스트림 클래스 계층 구조



✔️ JDK의 문자 스트림 클래스 계층 구조



💡 바이트 스트림


✔️ InputStream 클래스

바이트 기반 입력 스트림의 최상위 클래스로 추상 클래스 입니다.
모든 바이트 기반 스트림은 InputStream 클래스를 상속받아서 만들어집니다.

✔️ OutputStream 클래스

바이트 기반 입력 스트림의 최상위 클래스로 추상 클래스 입니다.
모든 바이트 기반 스트림은 OutputStream 클래스를 상속받아서 만들어집니다.

✔️ InputStream 과 관련된 메소드


🧷 int available() : 스트림에서 읽을 수 있는 크기를 바이트 단위로 리턴

🧷 int read() : 하나의 바이트를 읽어서 정수로 리턴, 못 읽으면 음수로 리턴

🧷 int read(byte[] b) : b 배열의 크기만큼 읽어서 b에 저장하고 
읽은 바이트 수를 리턴,데이터를 못 읽으면 0보다 작거나 같은 수를 리턴

🧷 int read(byte [] b , int offset, int length) : 
b배열에 offset 부터 length만큼을 읽어서 저장하고 읽은 개수를 리턴, 
데이터를 못 읽으면 0보다 작거나 같은 수를 리턴 

✔️ OutputStream 과 관련된 메소드

🧷 void close : 스트림 닫기

🧷 void flush : 현재 버퍼에 남아있는 내용 모두 출력

🧷 void write(int r) : r 을 기록

🧷 void write(byte[] b ) : b의 모든 내용을 기록 

🧷 void write(byte [] b , int offset, int length) : 
b 배열에서 offset 부터 length만큼 기록

✔️ FileInputStream/FileOutputStream

🧷 파일로부터 바이트 단위로 읽거나 저장하는 클래스

🧷 바이너리 파일의 입출력 용도

✔️ FileInputStream/FileOutputStream

🧷 자바의 기본 데이터 타입의 값(변수)을 바이너리 값 그대로 입출력

🧷 문자열도 바이너리 형태로 입출력



💡 문자 스트림


✔️ 문자 스트림이란?

🧷 유니 코드(2바이트) 문자를 입출력 하는 스트림
- 문자로 표현되지 않는 데이터는 다루지 못함
- 이미지, 동영상과 같은 바이너리 데이터는 입출력 할 수 없음

✔️ 문자 스트림을 다루는 클래스

🧷 Reader/Writer

🧷 InputStreamReader/OutputStreamWriter

🧷 FileReader/FileWriter


- 텍스트 파일에서 문자 데이터 입출력

업로드중..


✔️ Reader / Writer 클래스

문자 기반 입력 스트림의 최상위 클래스로 추상 클래스이다.

✔️ InputStreamReader / OutputStreamWriter 클래스

이 두 클래스는 바이트 스트림과 문자 스트림을 연결시켜주는 다리(bridge) 역할을 합니다.

두 클래스는 문자 집합을 이용하는데, InputStreamReader는 바이트를 읽어 
지전된 문자 집합 내의 문자로 인코딩하며, 
OutputStreamWriter는 문자를 바이트들로 디코딩하여 스트림으로 출력합니다.

✔️ FileReader / FileWriter 클래스

FileReader 나 FileWriter는 텍스트 파일로부터 직접 문자 데이터를 읽고 기록할 수 있습니다.

또한, FileReader는 FileInputStream과 연결해 읽어 들인 바이트를 
문자 데이터로 변환하기도 하며,FirleWriter는 FileOutputStream을 이용하여 
문자 스트림을 바이트 스트림으로 변환하여 파일에 기록하기도 합니다.

✔️ InputStreamReader 생성자

생성자설명
InputStreamReader(InputStream in)주어진 입력 바이트 스트림 in에 대해 기본 인코딩을 사용하는 객체를 생성
InputStreamReader(InputStream in, Sharset cs)cs 문자 집합의 인코딩을 사용해 in을 문자스트림으로 변환 객체를 생성
InputStreamReader(InputStream in, CharsetDecoder dec)dec 문자 집합의 디코더를 사용해 in을 문자스트림으로 변환 객체 생성
InputStreamReader(InputStream in, String charsetName)charsetName을 명명하는 인코딩을 사용하는 객체를 생성

✔️ InputStreamReader 메소드

메소드설명
void close()InputStreamReader를 닫는다
String getEncoding()현재 사용하고 있는 문자 인코딩의 표준 이름을 얻는다.
int read()문자 하나를 읽는다.(없을 경우 -1 반환
int read(char[] cbuf, int offset, int length)cbuf의 버퍼에 offset 부터 length 길이만큼의 문자를 읽는다.
boolean ready()InputStream에서 문자가 있는지 읽을 수 있는지 여부를 확인한다.

✔️ OutputStreamWriter 생성자

생성자설명
OutputStreamWriter(OutputStream out)주어진 출력 바이트 스트림 out에 대해 기본 인코딩을 사용하는 객체를 생성한다.
OutputStreamWriter(OutputStream out, Charset cs)cs 문자 집합의 인코딩을 사용해 out을 바이트스트림으로 변환 객체를 생성 한다.
OutputStreamWriter(OutputStream out, CharsetDecoder dec)dec 문자 집합의 디코더를 사용해 out을 바이트스트림으로 변환 객체를 생성 한다.
OutputStreamWriter(OutputStream out, String charsetName)charsetName을 명명하는 인코딩을 사용하는 객체를 생성한다.

✔️ OutputStreamWriter 메소드

메소드설명
void close()OutputStreamWriter를 닫는다.
void flush()OutputStreamWriter의 버퍼를 비운다. (출력한다.)
String getEncoding()현재 사용하고 있는 문자 인코딩의 표준 이름을 얻는다.
void write(char[] cbuf, int off, int len)cbuf의 버퍼에 off 부터 len 만큼을 담아 문자를 쓴다.
void write(int c)c개의 문자를 쓴다.
void write(String str, int off, int len)문자열 str 의 off부터 len 만큼을 쓴다.
profile
꾸준히
post-custom-banner

0개의 댓글