Stream과 Buffer

yuzu sim's avatar
Jan 08, 2024
Stream과 Buffer

예시


System.in : 자바가 만들어놓음
package ex15; import java.io.IOException; import java.io.InputStream; public class StreamEx01 { public static void main(String[] args) { InputStream input = System.in; // 키보드로부터 입력받음 = Input try { int value = input.read(); System.out.println("받은 값 : " + value); } catch (IOException e) { throw new RuntimeException(e); } } }
notion image
notion image

 

컴퓨터 : 3가지 계층으로 나눔

Application > OS > HardWare

Application = 코드 : 프로그램 > 실행 : 프로세스

인간의 영역 → 인간이 이해하기 쉬운 Byte로 전송
notion image
Application 기준으로 Input, Output 구분
ex) Application 이 모니터로 Output = 출력
 
메모리에 데이터를 넣는 것 = 변수에 데이터를 넣는 것
 
Stream : Byte들의 연속적인 흐름
하나의 방향만 가능함 → 입력 Stream과 출력 Stream이 각각 필요함
notion image
💡
Stream이 없으면 OS로 데이터 전송이 안됨
 
Character Stream : 문자 단위로 입출력
유니코드로 저장된 정보를 처리할 때 사용
Reader(입력) / Writer(출력)

ByteStream : 끝이 없는 Byte저장 공간

Byte의 흐름
1Byte 씩 전송되는 8bit 단위로 입출력을 수행
InputStream(입력) / OutputStream(출력)
유니코드로 저장된 정보를 처리할 때 불편함
 
notion image
임시로 만들어진 파일에 데이터가 들어옴
파일 : Application 과 OS의 매개체 역할을 하는 임시로 만들어진 파일
소켓 : 외부 세상에 데이터를 전송할 때
전송된 데이터는 누적되지 않고 OS가 소비할 때 지워짐
 
소비를 못하면 wait 걸림 → 출력이 밀려서 데이터가 쌓이고 결국 소멸됨
ex) 공급자가 데이터를 공급할 때 1초에 1개씩 전송할 때
1초에 1개씩 소비가 가능하면 상관없음
서로 같은 모니터를 공유해서 쓰기에 1초 만에 소비가 안되고
연속적으로 데이터가 와도 바빠서 6초 만에 소비할 수 있음
그럼 소멸될 수 있음
ex)
notion image
ByteStream이라서 1Byte씩 읽고 버려진 것
동시에 두 개가 내려와도 os가 한 개만 소비할 수 있음
Buffer = 보조 Stream이 필요함
Buffer에 저장해야 소멸 안되고 꺼내 쓸 수 있음
 

Buffer가 필요할 때 : 공급이 소비보다 많을 때 필요함

버퍼링 : 소비가 공급보다 빠를 때, 소비가 공급보다 느릴 때 발생

Buffer의 특징 : 쓰기, 읽기

한 번 사용되고 난 후에는 다시 사용되지 않음
BufferWriter : Output Stream = Output Buffer
보조 Byte가 몇 개인지는 개발자가 설정할 수 있음
notion image
notion image
 

데이터가 전송되는 과정

notion image
프로토콜 : 보조 Stream의 크기만큼 다 소비함
Buffer가 다 차지 않으면 소비하지 않음

flush : 다 차지 않았을 때 강제로 흘려보내는 것

전체 물길을 다 열어주는 것
통신의 기본 / 데이터 전송의 기본
 

보조 Stream이 Buffer가 되면 특이하게 작동함

통신할 때 사이즈를 고정해 놓으면 안됨
보조 스트림이 버퍼링을 제공하면 작업은 버퍼에 먼저 쓰이고, 일정한 양이 쌓이거나 특정 조건이 충족되면 실제 입출력 스트림으로 데이터가 전송
 
개발자 입장에서는 Buffer에 데이터를 담아서 다 전송하면 끝
 
프로세스마다 보조 thread가 만들어져서 실행이 됨
OS도 해당 Application 에 보조 Stream을 가지고 있음
notion image
 
BufferedReader : Input Buffer
ByteStream이 아님!!
notion image

데이터의 입출력 및 Stream 처리


  1. Application 계층
      • 특정 목적을 위해 데이터를 생성하거나 처리 > 다른 시스템 컴포넌트와 공유
  1. OS 계층
      • Application와 Hardware의 인터페이스 역할
      • 시스템 자원을 관리
      여러 Application간의 충돌을 방지하고 효율적인 자원 할당
      • 데이터 입출력과 스트림 처리
      OS 가 Hardware 와의 통신을 중개, 입출력 장치를 관리
      파일 시스템, 네트워크 프로토콜, 디바이스 드라이버 등
  1. Hardware 계층
      • 컴퓨터의 물리적인 부분을 의미
      CPU, 메모리, 입출력 장치, 버스 등
      • 데이터가 Hardware 로 흐를 때, 버스를 통해 데이터가 전송
      CPU 명령어에 따라 데이터를 처리, 주변 장치와 통신
       

파일에 데이터 쓰기 과정


  1. Application 계층
      • 파일에 데이터를 쓰기 위해 파일에 대한 입출력 스트림을 생성
      OS 를 통해 파일과 관련된 입출력 장치와 연결
  1. OS 계층
      • Application 의 요청을 받아 파일 시스템을 통해 파일에 대한 접근을 허용
      해당 입출력 장치와의 통신을 관리
      • 데이터는 버퍼에 일시적으로 저장되어 효율적인 입출력을 지원
      파일 시스템을 통해 데이터를 저장할 위치를 결정합니다.
  1. Hardware 계층
      • 버스를 통해 데이터를 주고받음
      실제로 데이터를 저장할 디스크 등의 입출력 장치와 통신
      CPU는 입출력 명령을 수행
      메모리에 있는 데이터를 버스를 통해 입출력 장치로 전송하거나 그 반대로 이루어짐

Client-Server 소켓 통신


  1. Application 계층
      • 클라이언트 애플리케이션
      사용자가 작성한 소프트웨어
      서버에 연결하기 위해 소켓을 생성하고 서버에 데이터를 전송하는 역할
      • 서버 애플리케이션
      클라이언트로부터의 연결을 기다림
      연결이 수립되면 해당 클라이언트와 데이터를 주고받는 역할
  1. OS 계층
      • 클라이언트 OS
      클라이언트 애플리케이션이 요청한 소켓을 생성
      서버의 IP 주소 및 포트에 연결
      소켓을 통한 데이터 전송을 지원
      데이터가 TCP/IP 프로토콜을 통해 전송
      • 서버 OS
      서버 애플리케이션이 클라이언트의 연결을 받아들임
      해당 클라이언트와의 소켓 통신을 위한 리소스를 할당
      소켓을 통한 데이터 전송을 관리
      데이터가 TCP/IP 프로토콜을 통해 전송
  1. Hardware 계층
      • 클라이언트 하드웨어
      클라이언트 애플리케이션이 동작하는 컴퓨터의 하드웨어는 소켓을 생성
      네트워크 인터페이스를 통해 데이터를 전송
      • 서버 하드웨어
      서버 애플리케이션의 서버 컴퓨터는 클라이언트로부터의 연결을 받아들임
      네트워크 인터페이스를 통해 클라이언트와의 데이터를 주고받음


 
 
Share article

Coding_study