كيفية تنفيذ عمليات الإدخال/الإخراج غير المحظورة باستخدام Java NIO؟
Jan 05, 2026
ترك رسالة
باعتباري مزودًا متخصصًا في حلول NIO (الإدخال/الإخراج غير المحظور)، فقد شهدت بنفسي القوة التحويلية لـ Java NIO في تطوير البرامج الحديثة. في منشور المدونة هذا، سأشارك رؤى حول كيفية تنفيذ الإدخال/الإخراج غير المحظور باستخدام Java NIO، مستفيدًا من خبراتي في هذا المجال.
فهم أساسيات Java NIO
يقدم Java NIO، الذي تم تقديمه في Java 1.4، طريقة جديدة لإجراء عمليات الإدخال/الإخراج مقارنةً بـ Java I/O التقليدية. تتضمن المكونات الأساسية لـ Java NIO القنوات والمخازن المؤقتة والمحددات. تشبه القنوات التدفقات في عمليات الإدخال/الإخراج التقليدية ولكنها ثنائية الاتجاه ويمكنها إجراء عمليات غير محظورة. تُستخدم المخازن المؤقتة للاحتفاظ بالبيانات أثناء عمليات الإدخال/الإخراج، وتعمل كحاوية لنقل البيانات بين القنوات والتطبيق. تسمح المحددات لخيط واحد بإدارة قنوات متعددة، مما يتيح عمليات إدخال/إخراج فعالة وغير قابلة للحظر.
المخازن المؤقتة في Java NIO
تقع المخازن المؤقتة في قلب Java NIO. وهي في الأساس حاويات للبيانات ذات سعة ثابتة. تتوفر أنواع مختلفة من المخازن المؤقتة، مثل ByteBuffer، وCharBuffer، وIntBuffer، وما إلى ذلك، اعتمادًا على نوع البيانات التي يمكنها الاحتفاظ بها.
لنأخذ مثالاً بسيطًا لاستخدام ByteBuffer:


import java.nio.ByteBuffer; public class BufferExample { public static void main(String[] args) { ByteBuffer buffer = ByteBuffer.allocate(1024); buffer.put("مرحبًا، Java NIO!".getBytes()); buffer.flip(); while (buffer.hasRemaining()) { System.out.print((char) buffer.get()); } } }
في هذا المثال، قمنا أولاً بتخصيص ByteBuffer بسعة 1024 بايت. ثم نضع بعض البيانات في المخزن المؤقت ونستدعينقف()طريقة تحضير المخزن المؤقت للقراءة. أخيرًا، نقرأ البيانات من المخزن المؤقت حتى لا يتبقى أي بيانات أخرى.
القنوات في جافا NIO
تُستخدم القنوات لقراءة البيانات من مصدر أو وجهة أو كتابتها. هناك عدة أنواع من القنوات في Java NIO، بما في ذلك FileChannel وSocketChannel وServerSocketChannel وDatagramChannel.
قناة الملف
يتم استخدام FileChannel لعمليات إدخال/إخراج الملفات. فيما يلي مثال لقراءة البيانات من ملف باستخدام FileChannel:
استيراد java.io.FileInputStream؛ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class FileChannelExample { public static void main(String[] args) { حاول (FileInputStream fis = new FileInputStream("example.txt"); FileChannelchannel = fis.getChannel()) { ByteBuffer buffer = ByteBuffer.allocate(1024); int bytesRead =channel.read(buffer); while (bytesRead != -1) { buffer.flip(); while (buffer.hasRemaining()) { System.out.print((char) buffer.get()); } buffer.clear(); bytesRead =channel.read(buffer); } } Catch (IOException e) { e.printStackTrace(); } } }
في هذا المثال، نقوم بإنشاء FileInputStream والحصول على FileChannel الخاص به. نقوم بعد ذلك بتخصيص ByteBuffer وقراءة البيانات من القناة إلى المخزن المؤقت. نقوم بقلب المخزن المؤقت للتحضير لقراءة البيانات وطباعتها. بعد القراءة، نقوم بمسح المخزن المؤقت ونواصل القراءة حتى لا يكون هناك المزيد من البيانات.
قناة المقبس وServerSocketChannel
يتم استخدام SwitchChannel وServerSocketChannel للإدخال/الإخراج للشبكة. فيما يلي مثال بسيط لخادم غير محظور يستخدم ServerSocketChannel وSocketChannel:
import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.Iterator; import java.util.Set; public class NonBlockingServer { public static void main(String[] args) { حاول (ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); Selector Selector = Selector.open()) { serverSocketChannel.socket().bind(new InetSocketAddress(8080)); serverSocketChannel.configureBlocking(false); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); بينما (صحيح) { int ReadyChannels = Selector.select(); إذا استمر (readyChannels == 0)؛ Set<SelectionKey>selectedKeys = Selector.selectedKeys(); Iterator<SelectionKey> keyIterator = SelectedKeys.iterator(); while (keyIterator.hasNext()) { SelectionKey key = keyIterator.next(); if (key.isAcceptable()) { ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel(); مقبس قناة مأخذ توصيل = serverChannel.accept(); المقبسChannel.configureBlocking(false); المقبسChannel.register(selector, SelectionKey.OP_READ); } else if (key.isReadable()) { SwitchChannel مقبسChannel = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.allocate(1024); int bytesRead = المقبسChannel.read(buffer); إذا (بايت قراءة > 0) { buffer.flip(); while (buffer.hasRemaining()) { System.out.print((char) buffer.get()); } } } keyIterator.remove(); } } } Catch (IOException e) { e.printStackTrace(); } } }
في هذا المثال، قمنا بإنشاء ServerSocketChannel وقمنا بتكوينه ليكون غير محظور. نقوم بتسجيل القناة باستخدام محدد لـOP_ACCEPTعملية. في الحلقة الرئيسية، نستخدم المحدد لانتظار القنوات الجاهزة. عندما تكون القناة جاهزة، نتحقق من نوع العملية (قبول أو قراءة) وننفذ الإجراء المقابل.
محددات في Java NIO
المحددات هي المفتاح لتحقيق الإدخال/الإخراج غير المحظور في Java NIO. يسمح المحدد لسلسلة رسائل واحدة بإدارة قنوات متعددة. يقوم بمراقبة القنوات لمختلف الأحداث، مثل القراءة والكتابة والاتصال والقبول.
في المثال السابق للخادم غير المحظور، استخدمنا محددًا لإدارة قنوات المقبس المتعددة. اليختار()طريقة كتل المحدد حتى تصبح قناة واحدة على الأقل جاهزة للعملية. بمجرد أن تصبح القناة جاهزة، يمكننا الحصول على مفتاح التحديد المقابل وإجراء العملية المناسبة.
تطبيقات العالم الحقيقي لـ Java NIO
يتم استخدام Java NIO على نطاق واسع في العديد من تطبيقات العالم الحقيقي، خاصة في خوادم الشبكة عالية الأداء والتطبيقات التي تتطلب عمليات إدخال/إخراج فعالة. على سبيل المثال، في تطوير مركبات الطاقة الجديدة، مثل2025 نيو ES8,2025 نيو ES7، ونيو نيو ET7يمكن استخدام Java NIO لاتصالات البيانات بين المكونات المختلفة للسيارة، مثل نظام إدارة البطارية ونظام التحكم في المحرك ونظام المعلومات والترفيه داخل السيارة.
خاتمة
يمكن أن يؤدي تنفيذ الإدخال/الإخراج غير المحظور باستخدام Java NIO إلى تحسين أداء تطبيقاتك وقابلية تطويرها بشكل كبير. من خلال فهم المكونات الأساسية لـ Java NIO، مثل المخازن المؤقتة والقنوات والمحددات، يمكنك تطوير تطبيقات إدخال/إخراج فعالة وعالية الأداء.
إذا كنت مهتمًا بتطبيق Java NIO في مشاريعك أو كنت بحاجة إلى مزيد من المعلومات حول حلول NIO الخاصة بنا، فلا تتردد في الاتصال بنا للشراء وإجراء المزيد من المناقشات.
مراجع
- "Java NIO" لرون هيتشنز
- وثائق جافا لحزمة NIO
