20230109 TIL | Java NIO Channel 의 read와 write 함수 이해하기

Choog Yul Lee·2023년 1월 10일
0

2023_TIL

목록 보기
4/6
post-thumbnail

📆 Date

  • 10th January 2023

🔑 Problem

Buffer에 쓴다고 하는데 read() 함수를 사용한다.
Buffer로 부터 읽는데 write() 함수를 사용한다.

이해가 되지 않는다. 도대체 왜 저리 만들었을까?

Writing Data to a Buffer

//read into buffer.
int bytesRead = inChannel.read(buf); 

Reading Data from a Buffer

//read from buffer into channel.
int bytesWritten = inChannel.write(buf);

note

개발하면서 Channel과 Buffer를 사용했던 기억이 있다.
근데 왜, 모르는 것이냐!


🛰️ Reference Site

🎽 Learn

1. 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의 정의에는 의사 소통 또는 정보 전달을 위한 매개체 정의가 포함되어 있다.

2. Channel 과 Buffer의 역할

우리는 매개체(medium)라는 말에 집중 할 필요가 있다. 매개체는 맺어 주는 행위에 집중하는 단어이다. Java NIO에서도 Channel매개체이다.

매개체
중간에서 어떤 일을 맺어 주는 것.

현실에서 매개체가 끝이라고 생각하지 않듯 Programming에서도 Channel 끝이 아니다. Programming에서 은 정보를 저장할 수 있는 무엇이라 생각할 수 있다. Programming에서 은 파일과 메모리이다. Programmer는 에 접근하여 데이터를 변경한다. 매개체를 이용하여 데이터를 전송한다.

  • Programmer는 Channel을 이용하여 데이터를 전송한다.
  • Programmer는 Buffer에 접근하여 데이터를 변경한다.

3. read() 와 write() 동작

이제 Channelread()write() 가 어떻게 동작하는지 살펴보자.

Channel 얻어오기

아래는 FileChannel 을 얻어 오는 코드이다.

RandomAccessFile file = new RandomAccessFile("data/data.txt", "rw");
FileChannel fileChannel = file.getChannel();

FileChannelfile.getChannel() 함수를 통해 얻어지는 것을 확인 할 수 있다. 그러므로 FileChannelFile에 종속되어 있다. 동일하게 SocketChannelSocket 에 종속되어 있고 ServerSocketChannelServerSocket에 종속되어 있다.

Channelread() 함수

read() 함수는 Channel이 종속된 Datasource에서 데이터를 읽어온다. 아래의 소스 코드에서 Datasource는 File이다. ChannelFile에서 데이터를 읽어와 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 에 쓴다.

Channelwrite() 함수

read() 함수는 Channel이 종속된 Datasource에 데이터를 쓴다. 그럼 어떤 데이터를 쓸까?? Buffer 에 있는 데이터를 Datasource에 쓴다.

  • Channel은 Datasource에 데이터를 쓴다.

  • Buffer 로 부터 읽어온 데이터를 쓴다.

🎁 Summary

이렇게 정리하면 될 것 같다.

FileChannel fileChannel = file.getChannel();
SocketChannel socketChannel = SocketChannel.open();
ServerSocketChannel serverSocketChannle = ServerSocketChannel.open();
  • Channel은 Datasource 종속된 매개체이다.
int bytesRead = inChannel.read(buf); 
  • Channelread() 하는 대상은 Datasource 이다.
  • read() 한 데이터를 어디로 보낼까 ? Buffer로 보낸다.
//read from buffer into channel.
int bytesWritten = inChannel.write(buf);
  • Channelwrite() 하는 대상은 Datasource 이다.
  • 어떤 데이터를 write() 할까? Buffer 있는 데이터이다.

0개의 댓글