Java NIO - รวบรวม

ดังที่เราทราบว่า Java NIO เป็น API ที่ได้รับการปรับให้เหมาะสมกว่าสำหรับการดำเนินการ IO ข้อมูลเมื่อเทียบกับ IO API ทั่วไปของ Java การสนับสนุนเพิ่มเติมอีกอย่างหนึ่งที่ Java NIO มีให้คือการอ่าน / เขียนข้อมูลจาก / ไปยังหลายบัฟเฟอร์ไปยังแชนเนล และการสนับสนุนการเขียนเรียกว่า Scatter and Gather ซึ่งข้อมูลจะกระจัดกระจายไปยังหลายบัฟเฟอร์จากช่องทางเดียวในกรณีของข้อมูลที่อ่านในขณะที่รวบรวมข้อมูลจากหลายบัฟเฟอร์ไปยังช่องเดียวในกรณีที่เขียนข้อมูล

เพื่อให้บรรลุการอ่านและเขียนหลายช่องทางนี้มี ScatteringByteChannel และ GatheringByteChannel API ซึ่ง Java NIO จัดเตรียมไว้สำหรับอ่านและเขียนข้อมูลดังที่แสดงในตัวอย่างด้านล่าง

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 ถูกนำมาใช้ในรูปแบบที่ปรับให้เหมาะสมและทำงานหลายอย่างพร้อมกันเมื่อใช้อย่างถูกต้องจะช่วยให้คุณสามารถมอบหมายให้ระบบปฏิบัติการทำงานหนักในการแยกข้อมูลที่คุณอ่านออกเป็นหลายที่เก็บข้อมูลหรือการประกอบ แยกชิ้นข้อมูลออกเป็นชิ้น ๆ ไม่ต้องสงสัยเลยว่าสิ่งนี้ช่วยประหยัดเวลาและใช้ระบบปฏิบัติการได้อย่างมีประสิทธิภาพมากขึ้นโดยหลีกเลี่ยงการคัดลอกบัฟเฟอร์และลดจำนวนโค้ดที่ต้องเขียนและดีบัก