2013년 8월 7일 수요일

[2주차 4일] 입출력(I/O) 1 - Data sink steam class

java.io

: java에서 OS가 입출력하는것을 도와주는 pakage



Data sink steam class

: 데이터를 직접 읽고(read) 쓰는(write) 클래스

* binary구분은 메모장에서 편집이 불가능하면 binary라고 보면 된다.

* Character계열의 Class들은 OS에 따라서 1byte혹은 2byte 해당 캐릭터셋에 맞는 리턴값을 넘긴다.

*CSV(Comma Seperated Value): 콤마로 분류해서 text로 저장해주는 것.


Read / Write의 배경

일단 아래의 그림을 보면서 간략히 이야기를 진행해 보자.
초기에는 응용프로그램이 직접 하드웨어 장비를 컨트롤 했었다. 그러다 보니 제조사들이 장비를 추가할때마다 소프트웨어사에서는 각각 제조사에 맞춰서 기능구현을 따로 해야 하는 어려움이 있었다.
 이런 문제점을 window에서 각 제조사 마다 function의 이름이 달랐던 것을 같은 장비의 같은 기능이면 function의 이름을 통일해서 응용프로그램이 장비를 제어할수 있도록 OS에서 Driver로 관리하게 된다. 그러면서 소프트웨어사는 각 비랜드별로 신제품이 나올때 마다 업데이트 해야하는 어려움이 없어지고 각 제자사에서 드라이버를 업데이트 하는 형식으로 바뀌게 되었다.
 그러다 가만보다 보니까 결국에는 이런 데이터들이 종류(영상, 사진, 음성, 문서)에 상관없이 byte라는 것에서 착안해서 유닉스에서는 매개체(File)에서 장비와 연결(Mount)하는 구조를 착안해 내기에 이르른다. 그러므로 어플리케이션에서는 단지읽기(read)/쓰기(write) 만으로 기능을 통일 할 수 있었고, 각 장비별로 다른 메서드를 호출할 필요없이 read/write메서드로만 호출하면 모든 종류의 데이터를 처리할 수 있게 된것이다.

ex>
// Data sink stream class
FileOutputStream out = new FileOutputStream("test1.data");

byte b = 0x34;
short s = 0x0a34;
int i = 0x0a0b0c34;
char c = 0xac01;
//boolean b = true;

out.write(b);
out.write(s >> 8);
out.write(s);
out.write(i >> 24);
out.write(i >> 16);
out.write(i >> 8);
out.write(i);
out.write(c >> 8);
out.write(c);
//out.write(b); 불가능

위의 예제를 보면 결과가 byte단위로 짤려서 출력되는 것을 볼수 있다.
즉, out.write(i); 경우 뒤의 '34'만 출력 되고 앞의 '0a0b0c'는 출력이 안되는데 매번 이런것을 비트연산자를 이용해서 옮겨주면서 출력해줄 수도 없는노릇이 아닌가? 그래서 나오게 된것이 나중에 나오게될 Data processing stream class 이다.



댓글 없음:

댓글 쓰기