Buffer에 쓴다고 하는데 read()
함수를 사용한다.
Buffer로 부터 읽는데 write()
함수를 사용한다.
이해가 되지 않는다. 도대체 왜 저리 만들었을까?
//read into buffer.
int bytesRead = inChannel.read(buf);
//read from buffer into channel.
int bytesWritten = inChannel.write(buf);
note
개발하면서 Channel과 Buffer를 사용했던 기억이 있다.
근데 왜, 모르는 것이냐!
일단 Channel 과 Buffer를 사전적 정의를 확인하자.
Channel
noun. a medium for communication or the passage of information
verb. direct toward a paricular end or object
Buffer
noun. COMPUTING
a temporary memory area in which data is stored while it is being processed or transferred, especially one used while streaming video or downloading audio.
Buffer는 컴퓨터 공학에서 어떤 의미로 사용되는지 사전에서 확인 할 수 있다. 하지만 Channel은 우리가 아는 것과 조금 다르다. 단순히 TV Channel이 아니다.
Oxford Languages 에 따르면 Channel의 정의에는 의사 소통 또는 정보 전달을 위한 매개체 정의가 포함되어 있다.
우리는 매개체(medium)라는 말에 집중 할 필요가 있다. 매개체는 맺어 주는 행위에 집중하는 단어이다. Java NIO에서도 Channel
은 매개체이다.
매개체
중간에서 어떤 일을 맺어 주는 것.
현실에서 매개체가 끝이라고 생각하지 않듯 Programming
에서도 Channel
끝이 아니다. Programming
에서 끝
은 정보를 저장할 수 있는 무엇이라 생각할 수 있다. Programming
에서 끝
은 파일과 메모리이다. Programmer는 끝
에 접근하여 데이터를 변경한다. 매개체
를 이용하여 데이터를 전송한다.
Channel
을 이용하여 데이터를 전송한다.Buffer
에 접근하여 데이터를 변경한다.이제 Channel
의 read()
와 write()
가 어떻게 동작하는지 살펴보자.
Channel
얻어오기아래는 FileChannel
을 얻어 오는 코드이다.
RandomAccessFile file = new RandomAccessFile("data/data.txt", "rw");
FileChannel fileChannel = file.getChannel();
FileChannel
은 file.getChannel()
함수를 통해 얻어지는 것을 확인 할 수 있다. 그러므로 FileChannel
은 File
에 종속되어 있다. 동일하게 SocketChannel
은 Socket
에 종속되어 있고 ServerSocketChannel
은 ServerSocket
에 종속되어 있다.
Channel
의 read()
함수read()
함수는 Channel
이 종속된 Datasource에서 데이터를 읽어온다. 아래의 소스 코드에서 Datasource는 File
이다. Channel
은 File
에서 데이터를 읽어와 Buffer
로 보낸다.
RandomAccessFile file = new RandomAccessFile("data/data.txt", "rw");
FileChannel fileChannel = file.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(48);
int bytesRead = fileChannel.read(buffer)
Channel
은 Datasource 로 부터 데이터를 읽는다.
읽은 데이터를 Buffer
에 쓴다.
Channel
의 write()
함수read()
함수는 Channel
이 종속된 Datasource에 데이터를 쓴다. 그럼 어떤 데이터를 쓸까?? Buffer
에 있는 데이터를 Datasource에 쓴다.
Channel
은 Datasource에 데이터를 쓴다.
Buffer
로 부터 읽어온 데이터를 쓴다.
이렇게 정리하면 될 것 같다.
FileChannel fileChannel = file.getChannel();
SocketChannel socketChannel = SocketChannel.open();
ServerSocketChannel serverSocketChannle = ServerSocketChannel.open();
Channel
은 Datasource 종속된 매개체이다.int bytesRead = inChannel.read(buf);
Channel
이 read()
하는 대상은 Datasource 이다.read()
한 데이터를 어디로 보낼까 ? Buffer
로 보낸다.//read from buffer into channel.
int bytesWritten = inChannel.write(buf);
Channel
이 write()
하는 대상은 Datasource 이다.write()
할까? Buffer
있는 데이터이다.