1. المفاهيم الأساسية
IO هي عملية نسخ البيانات حسب الذاكرة الرئيسية والأجهزة الخارجية (الأقراص الصلبة ، المحطات ، الشبكات ، إلخ). IO هو التنفيذ الوظيفي الأساسي لنظام التشغيل ، والذي يتم الانتهاء منه من خلال تعليمات الإدخال/الإخراج.
توفر جميع أنظمة وقت تشغيل اللغة أدوات عالية المستوى لأداء الإدخال/الإخراج. (C Printfscanf ، التغليف الموجهة للكائنات في Java)
2. مراجعة Java Standard IO
مكتبة فئة Java Standard IO هي تجريد من IO الموجهة إلى الكائن. بناءً على التنفيذ الأساسي للطرق المحلية ، لا نحتاج إلى الانتباه إلى التنفيذ الأساسي. InputStream/OutputStream: نقل بايت واحد في وقت واحد. القارئ/الكاتب: شخصية واحدة في وقت واحد.
3.nio مقدمة
NIO هو اختصار Javanewio ، واجهة برمجة تطبيقات جديدة مقدمة في JDK1.4. الخصائص التي تدعي صن رسميا على النحو التالي:
يوفر (عازلة) دعم ذاكرة التخزين المؤقت لجميع الأنواع البدائية.
مجموعة الأحرف الترميز وحلول فك التشفير.
القناة: التجريد الأصلي الجديد I/O.
يدعم واجهات الوصول إلى الملفات للملفات المعينة القفل والذاكرة.
يوفر شبكة I/O غير القابلة للتطوير غير المحظورة.
سوف تتعلم هذه المقالة وتقديم هذه الميزات.
4.Buffer & Chanel
القناة والمخزن المؤقت هما NIO وهي تجريدتي نوع البيانات الأساسيين.
المخزن المؤقت:
إنها كتلة مستمرة من الذاكرة.
إنه مكان العبور لقراءة أو كتابة بيانات NIO.
قناة:
مصدر البيانات أو وجهة البيانات
واجهة فريدة لتوفير البيانات إلى المخازن المؤقتة أو قراءة بيانات المخزن المؤقت ، الكائنات العازلة.
دعم I/O غير متزامن
مثال 1: copyfile.java:
عينة الحزمة ؛ استيراد java.io.fileInputStream ؛ استيراد java.io.fileOutputStream ؛ استيراد java.nio.bytebuffer ؛ استيراد java.nio.channels.filechannel ؛ colorfile public {public static void main (string [] "c: //copy.txt" ؛ // احصل على تدفقات الإدخال والإخراج من الملفات المصدر والهدف fileInputStream fin = جديد fileInputStream (infile) ؛ fileOutputStream fout = new FileOutputStream (Outfile) ؛ // الحصول على إدخال وإخراج قنوات filechannel fcin = fin.getchannel () ؛ العازلة = bytebuffer.allocate (1024) ؛ بينما (صحيح) {// clear method method refer the buffer بحيث يمكنه قبول قراءة data buffer.clear () ؛ // قراءة البيانات من قناة الإدخال إلى المخزن المؤقت int r = fcin.read (buffer) ؛ // قراءة طريقة إرجاع عدد البايتات ، والتي قد تكون صفر ، والتي قد تصل إلى نهاية الدفق ، إرجاع -1 إذا كانت (r == -1) قراءة البيانات حديثا إلى قناة أخرى buffer.flip () ؛ // كتابة البيانات من قناة الإخراج إلى المخزن المؤقت fcout.write (buffer) ؛}}}الهيكل الداخلي للمخزن المؤقت هو كما يلي (يتم نسخ الشكل التالي من المعلومات):
الشكل 2: البنية الداخلية العازلة
يتحكم المخزن المؤقت بشكل أساسي في عملية القراءة والكتابة من خلال ثلاثة متغيرات في وضع وحد وقدرة. يظهر معنى هذه المتغيرات الثلاثة في الجدول التالي:
المعلمة | وضع الكتابة | وضع القراءة |
موضع | عدد بيانات الوحدة المكتوبة حاليًا. | قراءة موقع بيانات الوحدة الحالية. |
حد | إنه يمثل الحد الأقصى لعدد وحدات البيانات والقدرة التي يمكن كتابتها هي نفسها. | ويمثل الحد الأقصى لعدد وحدات البيانات التي يمكن قراءتها ، وهو ما يتوافق مع مقدار بيانات الوحدة المكتوبة من قبل. |
سعة | سعة المخزن المؤقت | سعة المخزن المؤقت |
طرق العازلة الشائعة:
Flip (): تحويل وضع الكتابة إلى وضع القراءة
Rewind (): إعادة تعيين الموضع إلى 0 ، يستخدم بشكل عام للقراءة المتكررة.
Clear (): قم بمسح المخزن المؤقت والاستعداد ليتم كتابته مرة أخرى (يصبح الموضع 0 ، يصبح الحد الأقصى سعة).
Compact (): نسخ بيانات غير مقروءة إلى رأس المخزن المؤقت.
Mark () ، Reset (): يمكن وضع علامة على الموضع ، ويمكن إعادة تعيين إعادة تعيين إلى هذا الموقف.
أنواع شائعة من المخزن المؤقت: bytebuffer ، medbytebuffer ، charbuffer ، doublebuffer ، floatbuffer ، intbuffer ، longbuffer ، shortbuffer.
القنوات المشتركة: FileChannel ، DatagramChannel (UDP) ، Socketchannel (TCP) ، Serversocketchannel (TCP)
تم إجراء اختبار أداء بسيط على هذا الجهاز. يعمل جهاز الكمبيوتر المحمول الخاص بي في الاعتدال. (انظر المرفق للرمز المحدد. انظر المثال أدناه في حزمة nio.sample.filecopy) فيما يلي البيانات المرجعية:
السيناريو 1: انسخ ملف 370M
السيناريو 2: نسخ ثلاثة مؤشرات ترابط في نفس الوقت ، يقوم كل مؤشر ترابط بنسخ ملف 370M.
مشهد | FileInputStream+ FileOutputStream | FileInputStream+ BufferedInputStream+ FileOutputStream | Bytebuffer+ Filechannel | medbytebuffer +filechannel |
المشهد لبعض الوقت (ميلي ثانية) | 25155 | 17500 | 19000 | 16500 |
المشهد 2 مرة (ميلي ثانية) | 69000 | 67031 | 74031 | 71016 |
5.nio.charset
تشفير الأحرف وفك التشفير: Bytecode نفسه هو مجرد بعض الأرقام ، والتي يتم تحليلها بشكل صحيح في السياق الصحيح. عند تخزين البيانات في Bytebuffer ، تحتاج إلى النظر في طريقة الترميز لمجموعة الأحرف. عند قراءة وعرض بيانات Bytebuffer ، يمكنك فك تشفير مجموعة الأحرف.
يوفر Java.nio.charset مجموعة من الحلول للترميز وفك التشفير.
أخذ طلب HTTP الأكثر شيوعًا كمثال ، يجب ترميز الطلب بشكل صحيح عند الطلب. يجب فك تشفير الاستجابة بشكل صحيح عند الحصول عليها.
يرسل الرمز التالي طلبًا إلى Baidu ويحصل على نتائج العرض. يوضح المثال استخدام charset.
مثال 2Baidureader.java
package nio.readpage ؛ استيراد java.nio.bytebuffer ؛ استيراد java.nio.channels.socketchannel ؛ استيراد java.nio.charset قناة Socketchannel الخاصة ؛ public void readhtmlContent () {try {inetsocketaddress socketaddress = new inetsocketaddress ("www.baidu.com" ، 80) ؛ http/1.1 " +"/r/n/r/n ")) system.out.println (charset.decode (buffer)) ؛ // استخدم طريقة charset.decode لتحويل البايت إلى buffer.clear () ؛ // clear buffer}} catch (ioException e) {type.err.println ( {}}}} الفراغ الثابت العام (سلسلة [] args) {new Baidureader (). readHtmlContent () ؛}}6
فيما يتعلق بـ IO غير المحظورة ، سنفهم من جوانب ما يحظره ، وما هو غير محظور ، ومبدأ عدم الحظر وواجهة برمجة التطبيقات الأساسية غير المتزامنة.
ما هو الانسداد؟
عملية اتصال الشبكة IO الشائعة هي كما يلي:
من عملية اتصال الشبكة هذه ، دعونا نفهم ماهية الحجب:
إذا لم يصل الاتصال إلى العملية أعلاه ، فسيتم حظر قبول ، وسيتعين على البرنامج تعليقه بعد الجري هنا ، وسيقوم وحدة المعالجة المركزية بدلاً من ذلك بتنفيذ مؤشرات الترابط الأخرى.
إذا لم تكن البيانات جاهزة في العملية أعلاه ، فسيتم حظر القراءة أيضًا.
ميزات حظر شبكة IO: توصيلات متعددة متعددة. كل موضوع له مساحة مكدس خاصة به ويأخذ بعض وقت وحدة المعالجة المركزية. سيتم حظر كل موضوع عندما يواجه جاهزًا خارجيًا. نتيجة الحظر هي أنه سيؤدي إلى عدد كبير من تبديل سياق العملية. وقد يكون تبديل سياق العملية بلا معنى. على سبيل المثال ، لنفترض أن ترابط يستمع إلى منفذ ، وسيكون هناك سوى عدد قليل من الطلبات في يوم واحد ، ولكن يتعين على وحدة المعالجة المركزية أن تجعل باستمرار محاولات تبديل السياق للموضوع ، ومعظم عمليات التبديل في الحظر.
ما هو عدم الحظر؟
هنا استعارة:
على حافلة من A إلى B ، هناك العديد من النقاط التي قد تنطلق. لا يعرف السائق النقاط التي ستخرج من الحافلة. كيف تتعامل مع أولئك الذين يحتاجون إلى النزول من الحافلة بشكل أفضل؟
1. خلال هذه العملية ، يسأل السائق بانتظام كل راكب ما إذا كان قد وصل إلى الوجهة. إذا قال أحدهم ، توقف السائق ويذهب الراكب. (على غرار الحظر)
2. يخبر الجميع بائع التذاكر وجهته ثم ينام. يتفاعل السائق فقط مع بائع التذاكر. عندما يصل إلى نقطة معينة ، سيقوم بائع التذاكر بإخطار الراكب بالخروج من الحافلة. (على غرار عدم الحظر)
من الواضح أن الجميع للوصول إلى وجهة يمكن اعتباره موضوعًا ، ويمكن اعتبار السائق وحدة المعالجة المركزية. في نمط الحظر ، يحتاج كل مؤشر ترابط إلى استطلاع السياق والتبديل باستمرار لتحقيق نتيجة العثور على الوجهة. في وضع عدم الحظر ، ينام كل راكب (موضوع) (نائم) ويستيقظ فقط عندما تكون البيئة الخارجية الحقيقية جاهزة. مثل هذا الاستيقاظ بالتأكيد لن يحظر.
مبدأ عدم الحظر
قم بتبديل العملية بأكملها إلى مهام صغيرة واستكملها من خلال التعاون بين المهام.
يتولى موضوع مخصص جميع أحداث IO وهو مسؤول عن التوزيع.
آلية تعتمد على الحدث: المشغلات عند وصول الحدث ، بدلاً من مراقبة الأحداث في وقت واحد.
اتصال الموضوع: المواضيع التواصل من خلال الانتظار ، والإخطار والوسائل الأخرى. تأكد من أن كل مفتاح سياق منطقي. تقليل عملية تبديل العملية غير الضرورية.
فيما يلي هيكل IO غير المتزامن:
المفاعل هو الدور المجازي أعلاه لبائع التذاكر. من المحتمل أن يكون تدفق المعالجة لكل مؤشر ترابط قراءة البيانات ، وفك تشفير ، وحساب المعالجة ، والتشفير ، وإرسال الردود.
واجهة برمجة تطبيقات IO غير المتزامنة
المحدد
الفئة الأساسية من IO غير المتزامن ، والتي يمكنها اكتشاف الأحداث على واحدة أو أكثر من القنوات وتوزيع الأحداث.
استخدم موضوعًا محددًا للاستماع إلى الأحداث على قنوات متعددة وشرف الاستجابات المقابلة بناءً على برامج تشغيل الأحداث. ليست هناك حاجة لتخصيص موضوع لكل قناة.
مفتاح الاختيار
يحتوي على ربط القناة المقابلة لمعلومات حالة الحدث والوقت.
لخص
ما سبق هو المحتوى الكامل لهذه المقالة حول مقالات المعرفة الأساسية Java ، آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!