inblog logo
|
Coding_study
    JAVA

    Stream과 Buffer

    yuzu sim's avatar
    yuzu sim
    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

    RSS·Powered by Inblog