
스트림(Stream)
💡 스트림(Stream)
: 순서가 있는 데이터의 연속적인 흐름
하나의 스트림은 하나의 방향만 가능(입력 스트림과 출력 스트림)
키보드에 A라는 데이터를 입력하고 전송하려면
키보드랑 컴퓨터 사이 연결된 선이 있어야한다.
이 선이 스트림이다.

스트림은 1바이트 즉 8비트 단위로 데이터가 왔다갔다.
문자를 하나씩 전송하는 방법

Input/Output (I/O)
부호는 숫자로 변환되어 전송된다. 01000001
이 부호와 숫자는 아스키코드 표로 정의되어 있다.
컴퓨터 입장에서는 데이터가 들어오는 것.
Input 이다.
아스키코드표 부호화시킴
컴퓨터가 모니터에 출력하는 경우 데이터를 출력하는 것.
Output 이다.

바이트 스트림(Byte Stream)
8bit의 바이트 단위로 입출력. 이진 데이터 읽고 쓰기 위해 사용.
한 글자만 받음. 두 글자 이상을 받을 수 없다.
Input Stream / Output Stream

바이트 스트림 이용해보기
A : 정상 데이터
01000001 : 인코딩 데이터
65 : 디코딩 데이터
read() : 디코딩메서드
public class Stream01 {
public static void main(String[] args) {
InputStream in = System.in; // System.in (키보드)
// 1. 키보드 A를 인코딩해서 01000001 으로 컴퓨터에게 전송
// 2. ByteStream으로 흘러들어간다. (Input)
// 3. read() 메서드로 01000001 -> 65로 디코딩
// 4. 65를 문자로 부호화 시킨다.
try {
int data = in.read(); // 디코딩
System.out.println(data);
System.out.println((char)data); // 문자로 부호화
} catch (Exception e) {
e.printStackTrace();
}
}
}
바이트 스트림의 단점은
한 번에 1바이트 씩만 보낼 수 있으므로
여러 개를 보내도 하나만 보내진다.


배열 스트림(Character Stream)
여러 개를 한번에 보낼 수 있다는 장점이 있지만,
배열의 크기를 미리 정해두어야 하기 때문에 낭비가 너무 심하다.




버퍼(Buffer)
임시 저장 공간.
창고에 쌀을 넣으려는데 창고가 가득 차면 쌀을 임시로 보관하는 창고가 필요한데,
이 임시 보관 공간이 버퍼.

버퍼 스트림 BufferedReader
숫자를 부호화해주고 문자를 가변적으로 받을 수 있다. 배열의 공간 낭비가 없다 !

HelloWorld를 입력하고 엔터를 치면 어떻게 될까?
버퍼의 특징
양끝단 버퍼의 크기를 맞춘다.
버퍼가 가득차면 상대 버퍼가 비워져 있는 경우에 자동 전송된다.(flush)
전송된 후 버퍼가 비워지고 그 자리에 나머지 데이터가 갱신된다.
readLine(); 전송받은 데이터를 비우는 메서드

<버퍼 스트림 과정>
- A가 버퍼에 내용을 담아 B에게 보낼 준비를 한다. B 버퍼가 비어있어 전송 가능.

2. B버퍼에 전송 후 B버퍼가 비워지지 않은 상태라면 A는 B가 보내도 된다고 할 때까지 보내지 못한다.

3. B의 버퍼 내용을 옮기고 비워진 상태라면, A는 나머지를 전송할 수 있다.
readline() = 버퍼를 비우는 것. 통신하는 것 아님.


4. flush() 로 인해 버퍼가 가득 차지 않아도 옮길 수 있다.

'Language > Java' 카테고리의 다른 글
| 일대일 단방향 소켓통신(지속) (0) | 2023.04.21 |
|---|---|
| 포트, 소켓으로 단방향 일대일 통신(종료) (1) | 2023.04.17 |
| String Constant Pool / 문자열 비교는 equals (0) | 2023.04.10 |
| 예외처리(Exception) : try-catch (0) | 2023.04.07 |
| 동기적 실행 vs 비동기적 실행 (0) | 2023.04.07 |