Stream

2 minute read

애인 - 사람을 사랑하는 것.


Stream

  • wikipedia.org

컴퓨터 처리 환경에서 스트림(stream)은 시간이 지남에 따라 사용할 수 있게 되는 일련의 데이터 요소를 가리키는 수많은 방식에서 쓰인다.

  • 자바의 정석

자바에서 입출력을 수행하러면, 즉 어느 한쪽에서 다른 쪽으로 데이터를 전달하려면, 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데 이것을 스트림이라고 정의했다.

스트림이란 데이터를 운반하는데 사용되는 연결 통로이다.

스트림은 연속적인 데이터의 흐름을 물에 비유해서 붙여진 이름인데 여러 가지로 유사한 점이 많다. 물이 한쪽 방향으로만 흐르는 것과 같이 스트림은 단방향 통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다.

그래서 입력과 출력을 동시에 수행하려면 입력을 위한 입력 스트림과 출력을 위한 출력 스트림, 모두 2개의 스트림이 필요하다.

Byte Stream

Byte Stream은 1 byte를 Input/Output 할 수 있는 Stream 이다.

1 Byte는 8 bit 이다. 1 bit는 0과 1로 표현되는 2진수(binary) 또는 bit라고 불립니다.
일반적으로 8개의 단위의 비트(8bit)를 하나의 그룹으로 사용하는데 이를 바이트라고합니다.

  • 1 바이트 -> 8 비트
  • 1 킬로바이트 -> 1000바이트 -> 8000비트
  • 1 메가바이트 -> 10^6바이트 -> 8 * 10^6
  • 1 기가바이트 -> 10^9바이트 -> 8 * 10^9
  • 1 테라바이트 -> 10^12바이트 -> 8 * 10^12

Byte InputStream ( InputStream )

  • public abstract int read() throws IOException

입력 스트림으로 부터 1 byte를 읽어서 반환한다. 읽을 수 없으면 -1 을 반환한다.


try(InputStream inputStream = new FileInputStream("D:\\GIT\\sample\\sample\\java\\samplecode\\sample_data.txt");){
    int readByte;

    while((readByte = inputStream.read()) != -1){
        log.info("{}", readByte);
    }
}catch (Exception exception){
    exception.printStackTrace();
}

  • public int read(byte[] b, int off, int len) throws IOException

입력 스트림으로부터 len개의 byte를 읽어서 byte 배열 b의 off 위치 부터 저장한다


InputStream inputStream = null;
byte[] buffer = new byte[8192];
char chracter;

try {
    // new input stream created
    inputStream = new FileInputStream("D:\\GIT\\sample\\sample\\java\\samplecode\\sample_data.txt");

    log.info("Characters printed:");

    // read stream data into buffer
    inputStream.read(buffer, 2, 3);

    // for each byte in the buffer
    for(byte byteCode : buffer) {

        // convert byte to character
        if(byteCode == 0)
            // if b is empty
            chracter = '-';
        else
            // if b is read
            chracter = (char)byteCode ;

        log.info("Converted : {}", chracter);
    }

} catch(Exception exception) {
    // if any I/O error occurs
    exception.printStackTrace();

    log.error(exception.getMessage());
} finally {
    // releases system resources associated with this stream
    if(inputStream != null)
        inputStream.close();
}

  • public int read(byte[] b) throws IOException

입력 스트림으로부터 byte 배열 b의 크키 만큼 데이터를 읽어서 배열 b에 저장한다.


InputStream inputStream = new FileInputStream("/Users/dream/GIT/sample/java/samplecode/sample_data.txt");

byte[] buffer = new byte[300];

inputStream.read(buffer);

for (int i = 0; i < buffer.length; i++) {
    char value = (char)buffer[i];

    log.info("value : {}", value);
}

  • public long skip(long n) throws IOException

입력 스트림으로 부터 n bytes 만큼을 버리고 건너뛴다.


InputStream inputStream = new FileInputStream("/Users/dream/GIT/sample/java/samplecode/sample_data.txt");

byte[] buffer = new byte[20];

inputStream.skip(4000);
inputStream.read(buffer);

StringBuilder stringBuilder = new StringBuilder();

for (int i = 0; i < buffer.length; i++) {
    char value = (char)buffer[i];

    stringBuilder.append(value);

    log.info("value : {}", stringBuilder.toString());
}

  • public int available() throws IOException

입력 스트림을 호출 하는 함수의 그 다음 호출에 의해서 막힘 없이 읽을 수 있는 bytes의 수에 대한 예측을 반환한다.


private static void inputStream_readSample4() throws Exception {
    InputStream inputStream = new FileInputStream("/Users/dream/GIT/sample/java/samplecode/sample_data.txt");

    log.info("size : {}", inputStream.available());
}


  • public void close() throws IOException : 입력스트림을 닫고 해당 입력 스트림과 시스템 자원을 해제한다.

  • public void mark(int readlimit) : 입력 스트림에서의 현지 위치를 표시한다.

  • public void reset() throws IOException: 마크된 포지션으로 입력 스트림을 다시 위치시킨다.

  • public boolean markSupported() : 해당 입력 스트림이 mark와 reset 함수를 지원하는 지 테스트한다.

Byte 기반 스트림

  • FileInputStream <-> FileOutputStream : 파일
  • ByteArrayInputStream <-> ByteArrayOuputStream : 메모리(byte배열)
  • PipedInputStream <-> PipedOutputStream : 프로세스 ( 프로세스간의 통신 )
  • AudioInputStream <-> AudioOutputStream : 오디오 장치

출처

Tags:

Categories:

Updated: