2014년 9월 23일 화요일

입출력 스트림의 개념

스트림

어느 한 방향으로의 물결, 흐름을 의미한다

우린 인생스트림을 나아가고 있다고도 할 수 있다

하지만 구체적으로는 추상적 의미보단 놀이동산에 줄지어 서 있듯이,

혹은 은하수처럼 뭔가의 물체들이 끊김없이 늘어서 있는 것이라고

볼 수 있다. 프로그램에서는 통로, 길의 의미가 가장 적합하다

입출력 스트림

InputStream 과 OutputStream 은 말그대로 입출력하는 통로, 길을 말한다

input, output 해도 상관없었겠지만 이것은 길의 의미가 보여지지 않는다

101010101010111010111 이런 데이터1 흐름이
줄지어서 한방향으로 가는 길을 다룬다는 의미에서stream이 추가되었다.
길은 각각 일방통행이며 나가는 길과 들어오는 길 두가지만 존재한다

입출력 주체

초보들에게 프로그래밍이 어려운 이유중 하나가
너무 당연한 말들이 많아서, ‘그런갑다’ 하고 대충대충 넘어가기 때문이다
그러고 막상 코딩할려하면 기억상실에 걸린채로
키보드앞에 모아이석상이 된다
최악은 그 상태에서 현실도피를 하며 웹브라우저를 켜는 것이다 -ㅅ-;;

기본지식에선 당연하지만 프로그래밍에선 당연한게 없다..
그야말로 기초적 상식부터
하나하나 되짚어가지 않으면 뒤통수 크게 맞는 수가 있다
입출력에서도 엄청나게 중요하지만
그냥 대충 잊고 넘어갈 수 있는게 있는데 바로 입출력의 주체이다.

입출력의 방향은 프로그램을 원점으로 한다

이걸 그냥 넘기면 막상 코딩때 헷갈리게 된다.
즉 다음과 같은 코드가 있을때

    InputStream.read(buffer);
    OutputStream.write(buffer);

read는 buffer를 읽고, write는 buffer에 쓴다

이런식으로 거꾸로 이해해버릴 수가 있다. 실제론 아래와 같다

                
InputStream.read(buffer);

                 
OutputStream.write(buffer);


InputStream에서 꺼내서 buffer에 저장하는 것이 입력이고
buffer를 OutputStream에 저장하는 것이 출력인 것이다

InputStream씨가 읽는다 라고 생각해서 오류가 생기는 것이다
하지만 InputStream은 앞서 말했듯이
데이터가 들어오는 통로이지 주체가 아니다

주체는 어디까지나 프로그램이다.
그러므로 위의 코드는 이렇게 해석이 된다

  • 프로그램님이 들어오는 물길에서 읽고(read) buffer에 저장한다
  • 프로그램님이 나가는 데이터의 줄기에다가 buffer의 내용을 쓴다(write)

모든걸 간단히 요약하면
InputStream이 web.getInputStream으로 가져오던 new FileInputStream() 이던
어디서 가져오던간에 무조건 프로그램 입장에서 In이다. 데이터가 들어오기만 한다

반대로 OutputStream은 무조건 출력이다. 밖으로 내보낼 수밖에 없다

사용법

직접 사용을 통해서 좀더 정확히 이해해보자

내 컴의 파일에서 자료를 읽은 후 웹으로 보내고 싶다고 하자
그럼 어떻게 해야할까
파일에서 뭘 읽고 싶으면 먼저 파일과 나(프로그램)사이의 길을 개설해야한다
개설방법은 InputStream 객체를 새로만들어 연결하거나 얻어오면 된다

FileInputStream fis = new FileInputStream(파일);

이렇게 만들수도 있고 어디선가
getInputStream 혹은 openInputStream 등등으로 얻어 올 수도 있다

통로를 만들었으니 이제 그걸 이용해서 물건을 받자

fis.read(buffer)

통로를 이용해서 데이터를 요청해 읽어들이는 것이다
읽었으면 저장을 해야한다. 그래서 파라메터로 저장소를 지정한다
위에선 buffer2라는 곳에 저장한다

자 이제 web으로 올리는 것을 생각해보자

앞과 비슷하다
일단 당연히 올라갈 통로가 있어야한다

개설하고 연결하자
여기선 그런 과정을 이미 만들어 놓은 메서드3를 이용하자

OutputStream out = web.getOutputStream();

편하게 개설했다
이제 저 길을 통해서 업로드하면 된다

out.write(buffer)

out 이라는 통로에가다 buffer를 write 한다.
그럼 통로를 통해 buffer 만큼 web에 올라가게 된다


Written with StackEdit.


  1. 어떤 데이터라도 0과 1로 이루어져 있다.
  2. 여기서 한꺼번에 다 읽은 후 몽땅 올리는 방법은 잘 쓰지 않는다
    이유는 프로그램이 먹는 메모리가 엄청 커지기 때문이다
    그래서 적당량 읽고 읽은 것을 다시 올리는 것을 반복한다
  3. 많은 객체에서는 이미 통로개설을 염두에 두고
    번거롭지 않게 이러한 메서드를 미리 만들어두었다

댓글 1개 :