Java NIO-수집

Java NIO는 Java의 기존 IO API에 비해 데이터 IO 작업에 더 최적화 된 API라는 것을 알고 있듯이 Java NIO가 제공하는 추가 지원은 여러 버퍼에서 채널로 데이터를 읽고 쓰는 것입니다. 쓰기 지원은 데이터가 읽기 데이터의 경우 단일 채널에서 다중 버퍼로 분산되고 쓰기 데이터의 경우 다중 버퍼에서 단일 채널로 데이터가 수집되는 분산 및 수집이라고합니다.

채널에서이 다중 읽기 및 쓰기를 수행하기 위해 Java NIO가 데이터 읽기 및 쓰기를 위해 제공하는 ScatteringByteChannel 및 GatheringByteChannel API가 아래 예제와 같이 제공됩니다.

GatheringByteChannel

write to multiple channels − 여기에서는 여러 버퍼의 데이터를 단일 채널에 쓰도록 만들었습니다.이를 위해 다시 여러 버퍼를 할당하고 버퍼 유형 배열에 추가 한 다음이 배열을 매개 변수로 GatheringByteChannel write () 메서드에 전달하여 데이터를 작성합니다. 시퀀스의 여러 버퍼에서 버퍼는 배열에서 발생합니다. 여기서 기억해야 할 점은 버퍼의 위치와 한계 사이의 데이터 만 기록된다는 것입니다.

다음 예제는 Java NIO에서 데이터 수집이 수행되는 방법을 보여줍니다.

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.GatheringByteChannel;

public class GatherExample {
   private static String FILENAME = "C:/Test/temp.txt";
   public static void main(String[] args) {
      String stream1 = "Gather data stream first";
      String stream2 = "Gather data stream second";
      ByteBuffer bLen1 = ByteBuffer.allocate(1024);
      ByteBuffer bLen2 = ByteBuffer.allocate(1024);
      // Next two buffer hold the data we want to write
      ByteBuffer bstream1 = ByteBuffer.wrap(stream1.getBytes());
      ByteBuffer bstream2 = ByteBuffer.wrap(stream2.getBytes());
      int len1 = stream1.length();
      int len2 = stream2.length();
      // Writing length(data) to the Buffer
      bLen1.asIntBuffer().put(len1);
      bLen2.asIntBuffer().put(len2);
      System.out.println("Gathering : Len1 = " + len1);
      System.out.println("Gathering : Len2 = " + len2);
      // Write data to the file
      try { 
         FileOutputStream out = new FileOutputStream(FILENAME);
         GatheringByteChannel gather = out.getChannel();						
         gather.write(new ByteBuffer[] {bLen1, bLen2, bstream1, bstream2});
         out.close();
         gather.close();
      }
      catch (FileNotFoundException exObj) {
         exObj.printStackTrace();
      }
      catch(IOException ioObj) {
         ioObj.printStackTrace();
      }
   }
}

산출

Gathering : Len1 = 24
Gathering : Len2 = 25

마지막으로 Java NIO의 분산 / 수집 접근 방식은 적절하게 사용될 때 최적화되고 멀티 태스킹 된 것으로 도입되었으며,이를 통해 읽은 데이터를 여러 버킷으로 분리하거나 조립하는 번거로운 작업을 운영 체제에 위임 할 수 있습니다. 이질적인 데이터 청크를 전체로 통합합니다. 이것은 버퍼 복사를 방지하여 시간을 절약하고 운영 체제를보다 효율적으로 사용하며 작성 및 디버그에 필요한 코드 양을 줄입니다.