Java NIO-분산 형

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

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

ScatteringByteChannel

Read from multiple channels − 여기에서는 단일 채널의 데이터를 여러 버퍼로 읽어 들여서 여러 버퍼를 할당하여 버퍼 유형 배열에 추가 한 다음이 배열을 매개 변수로 ScatteringByteChannel read () 메소드에 전달한 다음 데이터를 씁니다. 시퀀스의 채널 버퍼는 배열에서 발생합니다. 버퍼가 가득 차면 채널은 다음 버퍼를 채우기 위해 이동합니다.

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

C : /Test/temp.txt

Hello World!
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.ScatteringByteChannel;

public class ScatterExample {	
   private static String FILENAME = "C:/Test/temp.txt";
   public static void main(String[] args) {
      ByteBuffer bLen1 = ByteBuffer.allocate(1024);
      ByteBuffer bLen2 = ByteBuffer.allocate(1024);
      FileInputStream in;
      try {
         in = new FileInputStream(FILENAME);
         ScatteringByteChannel scatter = in.getChannel();
         scatter.read(new ByteBuffer[] {bLen1, bLen2});
         bLen1.position(0);
         bLen2.position(0);
         int len1 = bLen1.asIntBuffer().get();
         int len2 = bLen2.asIntBuffer().get();
         System.out.println("Scattering : Len1 = " + len1);
         System.out.println("Scattering : Len2 = " + len2);
      } 
      catch (FileNotFoundException exObj) {
         exObj.printStackTrace();
      }
      catch (IOException ioObj) {
         ioObj.printStackTrace();
      }
   }
}

산출

Scattering : Len1 = 1214606444
Scattering : Len2 = 0

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