BufferedInputStream
BufferedInputStream هو دفق إدخال مخزنة. يرث من FilterInputStream.
الغرض من BufferedInputStream هو إضافة بعض الميزات إلى دفق إدخال آخر ، مثل توفير "وظائف التخزين المؤقت" ودعم "علامات Mark ()" و "إعادة تعيين () إعادة تعيين".
يتم تنفيذ BufferedInputStream بشكل أساسي من خلال صفيف العازلة الداخلية. على سبيل المثال ، بعد إنشاء BufferEdInputStream يتوافق مع دفق إدخال معين ، عندما نقرأ بيانات دفق الإدخال من خلال read () ، سوف يملأ BufferEdInputStream بيانات دفق الإدخال في المخزن المؤقت في الدفعات. عندما تتم قراءة البيانات في المخزن المؤقت ، سيملأ دفق الإدخال المخزن المؤقت للبيانات مرة أخرى ؛ سيتم تكرار ذلك حتى انتهينا من قراءة موقع بيانات دفق الإدخال.
قائمة وظائف BufferEdInputStream:
BufferedInputStream (inputStream in) BufferEdInputStream (inputStream in ، int size) متزامن int متاح () إغلاق الفراغ () علامة الفراغ المتزامنة (int readlimit) marksuported intecount () متزامنة int int () int int int (inte [] buffer int int ، bytecount)
نموذج الرمز:
للاستخدام التفصيلي لـ API في BufferedInputStream ، راجع رمز المثال (BufferedInputStreamTest.java):
استيراد java.io.bufferedInputStream ؛ استيراد java.io.bytearrayinputstream ؛ استيراد java.io برنامج اختبار BufferEdInputStream * * Author Skywang */الفئة العامة BufferedInputStreamTest {Private Static Final int len = 5 ؛ public static void main (string [] args) {testbufferedInputStream () ؛ } / *** وظيفة اختبار API لـ BufferedInputStream* / private static void testbufferedInputStream () {// إنشاء دفق بايت bufferedInputStream ، فإن المحتوى عبارة عن مجموعة Arrayletters try {file = ملف جديد ("bufferedInputStream.txt") ؛ inputStream في = جديد bufferedInputStream (FileInputStream جديد (ملف) ، 512) ؛ // اقرأ 5 بايت من تيار البايت. "ABCDE" ، A يتوافق مع 0x61 ، B يتوافق مع 0x62 ، وهكذا ... من أجل (int i = 0 ؛ i <len ؛ i ++) {// إذا كان بإمكانك الاستمرار في قراءة البايت التالي ، اقرأ البايت التالي إذا (in.available ()> = 0) system.out.printf ("٪ d: 0x ٪ s/n" ، i ، integer.toHexString (TMP)) ؛ }} // إذا كان "This Byte Stream" لا يدعم وظيفة وضع العلامات ، فخرج مباشرةً إذا (! in.marksupported ()) {system.out.println ("اجعل غير مدعوم!") ؛ يعود ؛ } // mark "موضع الفهرس الحالي" ، أي علامة على عنصر الموضع السادس - "f" // 1024 يتوافق مع marklimit in.mark (1024) ؛ // تخطي 22 بايت. in.skip (22) ؛ // اقرأ 5 بايت بايت [] buf = new byte [len] ؛ in.Read (buf ، 0 ، len) ؛ // تحويل BUF إلى سلسلة سلسلة. String str1 = سلسلة جديدة (buf) ؛ system.out.printf ("str1 = ٪ s/n" ، str1) ؛ // إعادة تعيين "فهرس دفق الإدخال" إلى الموضع الذي يحمل علامة Mark () ، أي إعادة تعيين إلى "F". in.Reset () ؛ // اقرأ 5 بايت في BUF من "إعادة تعيين بايت تيار". وهذا هو ، اقرأ "fghij" in.read (buf ، 0 ، len) ؛ // تحويل BUF إلى سلسلة سلسلة. String str2 = سلسلة جديدة (buf) ؛ system.out.printf ("str2 = ٪ s/n" ، str2) ؛ in.close () ؛ } catch (fileNotFoundException e) {e.printStackTrace () ؛ } catch (SecurityException e) {E.PrintStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}} محتوى BufferedInputStream.txt في البرنامج هو كما يلي:
ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
نتائج التشغيل:
0: 0x611: 0x622: 0x633: 0x644: 0x65str1 = 01234str2 = fghij
bufferedoutputstream
BufferEdoutputStream هو دفق الإخراج مخزنة. يرث من FilterOutputStream.
تتمثل وظيفة BufferedOutputStream في توفير "التخزين المؤقت" لتيار إخراج آخر.
قائمة وظائف BufferOutputTream:
BufferedOutputStream (OutputStream Out) BuffereDoutputStream (OutputStream Out ، int) Close متزامنة الفراغ المتزامنة () تدفق الفراغ المتزامن () كتابة الفراغ المتزامن (البايت [] العازلة ، إزاحة int ، طول)
نموذج الرمز:
للاستخدام التفصيلي لـ API في BufferedOutputStream ، راجع رمز المثال (BufferedOutputStreamTest.java):
استيراد java.io.bufferedoutputstream ؛ استيراد java.io.file ؛ استيراد java.io.outputstream ؛ استيراد java.io.fileOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.io.filenotfoundexception ؛ برنامج * * Author Skywang */public class bufferedoutputstreamtest {private static final int len = 5 ؛ // المقابلة لرسائل اللغة الإنجليزية "abcddefghijklmnopqrssttuvwxyz byte byte static static [] arrayletters = {0x61 ، 0x62 ، 0x63 ، 0x64 ، 0x65 ، 0x66 ، 0x67 ، 0x68 ، 0x69 ، 0x6a ، 0x6. 0x6f ، 0x70 ، 0x71 ، 0x72 ، 0x73 ، 0x74 ، 0x75 ، 0x76 ، 0x77 ، 0x78 ، 0x79 ، 0x7a} ؛ public static void main (string [] args) {testBufferedOutputStream () ؛ } / *** وظيفة اختبار API لـ BufferedOutputStream* / private static void testbufferedoutputstream () {// إنشاء bufferedoutputstream المقابلة لـ "دفق إخراج الملفات" // حجم المخزن المؤقت المقابل هو 16 ، أي عندما تكون بيانات المخزن المؤقت> = 16 ، سيتم كتابة محتوى المخزن المؤقت تلقائيًا إلى البث المباشر للإخراج. حاول {file file = ملف جديد ("Out.txt") ؛ OutputStream Out = جديد bufferedoutputstream (FileOutputStream جديد (ملف) ، 16) ؛ // اكتب أول 10 بايت من صفيف Arrayletters إلى دفق الإخراج Out.write (Arrayletters ، 0 ، 10) ؛ // اكتب "newline/n" إلى دفق الإخراج Out.write ('/n') ؛ // تودو! // out.flush () ؛ readuSerInput () ؛ out.close () ؛ } catch (fileNotFoundException e) {e.printStackTrace () ؛ } catch (SecurityException e) {E.PrintStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} / *** اقرأ إدخال المستخدم* / private static void readuSerInput () {system.out.println ("الرجاء إدخال نص:") ؛ قارئ الماسح الضوئي = ماسح ضوئي جديد (System.in) ؛ // انتظر سلسلة إدخال str = reader.next () ؛ system.out.printf ("الإدخال هو: ٪ s/n" ، str) ؛ }} نتائج التشغيل:
قم بإنشاء الملف "Out.txt" ، ومحتوى الملف هو "ABCDEFGHIJ".
اختبار خطوة بخطوة: اتبع الخطوات الثلاث التالية لاختبار البرنامج لعرض حجم المخزن المؤقت ودور Flush ().
النوع 1: البرنامج الأصلي
(1) تشغيل البرنامج. عندما ينتظر البرنامج إدخال المستخدم ، تحقق من محتوى النص "Out.txt" ؛ البحث: المحتوى فارغ.
(2) تشغيل البرنامج. بعد إدخال المستخدم ، تحقق من محتوى النص "Out.txt" ؛ البحث: المحتوى هو "ABCDEFGHIJ".
من هذا ، نجد أن نتائج (01) و (02) مختلفة ؛ السبب في أن محتوى out.txt في (01) فارغ هو أن حجم المخزن المؤقت المقابل لـ Out.txt هو 16 بايت ، ونكتب فقط 11 بايت ، لذلك لا يؤدي عملية المخزن المؤقت الواضح (أي كتابة بيانات المخزن المؤقت إلى دفق الإخراج).
المحتوى المقابل لـ Out.txt هو "ABCDEFGHIJ" ، لأنه يتم تنفيذ Out.close () ، والذي يغلق دفق الإخراج ؛ قبل إغلاق دفق الإخراج ، سيتم كتابة بيانات المخزن المؤقت إلى دفق الإخراج.
ملاحظة: عند إعادة الاختبار ، قم أولاً بحذف Out.txt.
النوع 2: أضف العبارة التالية قبل readuSerInput ()
out.flush () ؛
الغرض من هذه الجملة هو كتابة "محتوى العازلة" في دفق الإخراج.
(1) تشغيل البرنامج. عندما ينتظر البرنامج إدخال المستخدم ، تحقق من محتوى النص "Out.txt" ؛ البحث: المحتوى هو "ABCDEFGHIJ".
(2) تشغيل البرنامج. بعد إدخال المستخدم ، تحقق من محتوى النص "Out.txt" ؛ البحث: المحتوى هو "ABCDEFGHIJ".
من هذا ، وجدنا أن نفس النتيجة (01) و (02) ، المحتوى المقابل لـ Out.txt هو "ABCDEFGHIJ". وذلك لأنه يتم تنفيذ عملية Flush () ، والتي يتم استخدامها لكتابة بيانات المخزن المؤقت إلى دفق الإخراج.
ملاحظة: عند إعادة الاختبار ، حذف Out.txt أولاً!
النوع 3: بناءً على النوع الأول ،
out.write (arrayletters ، 0 ، 10) ؛
تعديل ل
out.write (arrayletters ، 0 ، 20) ؛
(1) تشغيل البرنامج. عندما ينتظر البرنامج إدخال المستخدم ، تحقق من محتوى النص "Out.txt" ؛ ابحث عن أن المحتوى هو "ABCDEFGHIJKLMNOPQRST" (باستثناء Enter).
(02) تشغيل البرنامج. بعد إدخال المستخدم ، تحقق من محتوى النص "Out.txt" ؛ ابحث عن أن المحتوى هو "ABCDEFGHIJKLMNOPQRST" (بما في ذلك Enter).
من هذا ، وجدنا أن (01) نتيجة المدى هي "ABCDEFGHIJKLMNOPQRST" (باستثناء عودة النقل). وذلك لأن حجم المخزن المؤقت هو 16 ، ونكتب 20 بايت من خلال Out.write (Arrayletters ، 0 ، 20) ، يتجاوز حجم المخزن المؤقت ؛ في هذا الوقت ، سيتم كتابة جميع المدخلات مباشرة في دفق الإخراج دون المرور عبر المخزن المؤقت.
(3) نتيجة العملية هي "ABCDEFGHIJKLMNOPQRST" (بما في ذلك عودة النقل) ، لأنه عند التنفيذ.
ملاحظة: عند إعادة الاختبار ، حذف Out.txt أولاً!