DatainputStream
DatainputStream هو دفق إدخال البيانات. يرث من FilterInputStream.
يتم استخدام DataInputStream لتزيين تدفقات الإدخال الأخرى ، والتي "تتيح للتطبيقات قراءة أنواع بيانات Java الأساسية من دفق الإدخال الأساسي بطريقة مستقلة عن الجهاز." يمكن للتطبيقات استخدام DataOutputStream لكتابة البيانات التي تقرأها DatainputStream.
قائمة وظائف DatainputStream:
datainputStream (inputStream in) النهائي int int (byte [] buffer ، int int ، طول int) النهائي int int (byte [] buffer) النهائي boolean readboolean () النهائي byte readbyte () النهائي readchar readchar () نهائي readDouble int readint () Final String readline () Final Long readlong () Final Short ReadShort () Final Static String readutf (datainput in) Final String readutf () Final int readUnsignedByte () Final int readUnsignedShort () Final int skipbytes (int int)
نموذج الرمز:
حول الاستخدام التفصيلي لـ API في DatainputStream:
استيراد java.io.datainputStream ؛ استيراد java.io.dataoutputstream ؛ استيراد java.io.bytearrayinputStream ؛ import java.io java.io.filenotfoundException ؛ استيراد java.lang.securityexception ؛/** * datainputStream و DataOutputStream برنامج * * Author Skywang */public class datainputStreamTest {private static final len = 5 ؛ Public Static Void Main (String [] args) {// Test DataOutputStream وكتابة البيانات إلى دفق الإخراج. testDataOutputStream () ؛ // اختبار datainputStream لقراءة البيانات من نتيجة دفق الإخراج أعلاه. testDatainputStream () ؛ } / *** وظيفة اختبار API DataOutputStream* / private static void testDataoutPutStream () {try {file file = file new ("file.txt") ؛ DataOutputStream out = new DataOutputStream (FileOutputStream (ملف جديد)) ؛ out.writeBoolean (صواب) ؛ out.writeByte ((byte) 0x41) ؛ Out.Writechar ((char) 0x4243) ؛ Out.WriteShort ((قصيرة) 0x4445) ؛ out.writeint (0x12345678) ؛ Out.Writelong (0x0FEDCBA987654321L) ؛ out.writeutf ("abcdefghijklmnopqrstuvwxyz yan12") ؛ out.close () ؛ } catch (fileNotFoundException e) {e.printStackTrace () ؛ } catch (SecurityException e) {E.PrintStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} / ** * datainputStream API دالة * / private static void testDatainputStream () {try {file file = file new ("file.txt") ؛ DatainputStream في = جديد datainputStream (FileInputStream جديد (ملف)) ؛ System.out.printf ("BytetoHexString (0x8F): 0x ٪ S/N" ، BytetoHexString ((byte) 0x8f)) ؛ System.out.printf ("ChartoHexString (0x8FCF): 0x ٪ S/N" ، ChartoHexString ((char) 0x8fcf)) ؛ system.out.printf ("readBoolean (): ٪ s/n" ، in.readBoolean ()) ؛ system.out.printf ("readByte (): 0x ٪ s/n" ، bytetoHexString (in.readbyte ())) ؛ System.out.printf ("readchar (): 0x ٪ s/n" ، chartohexstring (in.readchar ())) ؛ System.out.printf ("readshort (): 0x ٪ s/n" ، shorttoHexString (in.readshort ())) ؛ system.out.printf ("readint (): 0x ٪ s/n" ، integer.toHexString (in.Readint ())) ؛ System.out.printf ("readlong (): 0x ٪ s/n" ، long.toHexString (in.readlong ())) ؛ system.out.printf ("readutf (): ٪ s/n" ، in.readutf ()) ؛ in.close () ؛ } catch (fileNotFoundException e) {e.printStackTrace () ؛ } catch (SecurityException e) {E.PrintStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} // اطبع السلسلة السداسية المقابلة لسلسلة البايت الثابتة الثابتة bytetoHexstring (byte val) {return integer.toHexString (val & 0xff) ؛ } // طباعة السلسلة السداسية المقابلة لـ Char private Static String ChartoHexString (char val) {return integer.toHexString (val) ؛ } // طباعة السلسلة السداسية المقابلة لسلسلة ثابتة قصيرة قصيرة شورتويكسسترنج (val) {return integer.toHexString (val & 0xffff) ؛ }} نتائج التشغيل:
BytetoHexstring (0x8f): 0x8fchartohexstring (0x8fcf): 0x8fcfreadBoolean (): truereadbyte (): 0x41readchar (): 0x42 43ReadShort (): 0x4445Readint (): 0x12345678ReadLong (): 0xfedcba987654321Readutf (): ABCDefghijklMnopqrstuvwxyz Yan12
وصف النتائج:
(1) عرض ملف file.txt. يتم عرض البيانات السداسية على النحو التالي:
القيمة int المقابلة لـ 001F هي 31. وهذا يعني طول بيانات UTF-8 التالية. طول الحرف "ABCDEFGHIJKLMNOPQRSTUVWXYZ YAN12" هو 26 ، وطول بيانات UTF-8 المقابلة لـ "门" هو 3 ؛ طول "12" هو 2. الطول الإجمالي = 26+3+2 = 31.
(2) إرجاع رمز مصدر السلسلة السداسية المقابلة للبايت كما يلي:
السلسلة الثابتة الخاصة bytetohexstring (byte val) {return integer.toHexString (val & 0xff) ؛} فكر في سبب: الرمز:
إرجاع integer.toHexString (Val & 0xff) ؛
بدلاً من
إرجاع integer.ToHexString (Val) ؛
دعونا نلقي نظرة أولاً على نتائج الإخراج لـ BytetoHexString ((Byte) 0x8F) ؛ في حالتين أعلاه.
إرجاع integer.toHexString (Val & 0xff) ؛ الإخراج المقابل هو "0xfffffff8f"
إرجاع integer.ToHexString (Val) ؛ الإخراج المقابل هو "0x8F"
لماذا هذا يحدث؟
السبب في الواقع بسيط للغاية ، إنها المشكلة الناجمة عن "تحويل نوع البايت إلى نوع int".
0x8F من نوع البايت هو رقم سالب ، والثنائي المقابل هو 10001111 ؛ عند تحويل بايت رقم سالب إلى نوع int ، يتم إجراء تحويل موقّع (يتم ملء بتات جديدة بعدد البتات الموقعة). علامة البضع من 0x8F هي 1 ، لأنه عند تحويله إلى int ، تمتلئ بـ "1" ؛ النتيجة بعد التحول (الثنائي) هي 111111111111111111111111111111111111111111111111111111111 ، و Quexadecimal المقابلة هو 0xffffff8f.
لأنه عندما نقوم بتنفيذ integer.toHexString (VAL) ؛ ، تم إرجاعه هو 0xfffffff8f.
في integer.tohexstring (Val & 0xFF) ، فإنه يعادل 0xffffffff8f & 0xff ، والنتيجة هي 0x8f.
(3) إرجاع السلسلة السداسية المقابلة لـ Char و Short. الرمز المصدري المقابل لـ "إرجاع السلسلة السداسية المقابلة لـ Char" كما يلي:
سلسلة ثابتة chartohexstring (char val) {return integer.tohexstring (val) ؛} "إرجاع السلسلة السداسية المقابلة للاختصار" يتوافق مع رمز المصدر على النحو التالي:
سلسلة ثابتة خاصة شورتويكسترينج (فال قصير) {return Integer.ToHexString (Val & 0xffff) ؛} مقارنة الوظيفتين أعلاه ، لماذا أحدهما "Val" والآخر هو "Val & 0xffff"؟
من خلال تحليل (2) ، نستنتج بالمثل لماذا "إرجاع السلسلة السداسية المقابلة لـ Short" هو تنفيذ "Val & 0xffff".
ومع ذلك ، لماذا تحتاج إلى تنفيذ "Val" إذا "إرجاع السلسلة السداسية المقابلة لـ Char". السبب بسيط جدا جدا. في Java ، تشار هو نوع غير موقّع ، وهو ما يمثل بايتتين. تحويل char إلى نوع int ، ويقوم بتحويل غير موقّع ، ويضيف كل ما يملأه 0.
DataOutputStream
DataOutputStream هو دفق إخراج البيانات. يرث من FilterOutputStream.
يتم استخدام DataOutputStream لتزيين تدفقات الإخراج الأخرى ، باستخدام تدفقات إدخال DataOutputStream و DatainputStream ، "السماح للتطبيقات بقراءة وكتابة أنواع بيانات Java الأساسية من دفق الإدخال الأساسي بطريقة مستقلة عن الجهاز."
عينة رمز للاستخدام التفصيلي لـ API في DataoutStream:
استيراد java.io.datainputStream ؛ استيراد java.io.dataoutputstream ؛ استيراد java.io.bytearrayinputStream ؛ import java.io java.io.filenotfoundException ؛ استيراد java.lang.securityexception ؛/** * datainputStream و DataOutputStream برنامج * * Author Skywang */public class datainputStreamTest {private static final len = 5 ؛ Public Static Void Main (String [] args) {// Test DataOutputStream وكتابة البيانات إلى دفق الإخراج. testDataOutputStream () ؛ // اختبار datainputStream لقراءة البيانات من نتيجة دفق الإخراج أعلاه. testDatainputStream () ؛ } / *** وظيفة اختبار API DataOutputStream* / private static void testDataoutPutStream () {try {file file = file new ("file.txt") ؛ DataOutputStream out = new DataOutputStream (FileOutputStream (ملف جديد)) ؛ out.writeBoolean (صواب) ؛ out.writeByte ((byte) 0x41) ؛ Out.Writechar ((char) 0x4243) ؛ Out.WriteShort ((قصيرة) 0x4445) ؛ out.writeint (0x12345678) ؛ Out.Writelong (0x0FEDCBA987654321L) ؛ out.writeutf ("abcdefghijklmnopqrstuvwxyz yan12") ؛ out.close () ؛ } catch (fileNotFoundException e) {e.printStackTrace () ؛ } catch (SecurityException e) {E.PrintStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} / ** * datainputStream API دالة * / private static void testDatainputStream () {try {file file = file new ("file.txt") ؛ DatainputStream في = جديد datainputStream (FileInputStream جديد (ملف)) ؛ System.out.printf ("BytetoHexString (0x8F): 0x ٪ S/N" ، BytetoHexString ((byte) 0x8f)) ؛ System.out.printf ("ChartoHexString (0x8FCF): 0x ٪ S/N" ، ChartoHexString ((char) 0x8fcf)) ؛ system.out.printf ("readBoolean (): ٪ s/n" ، in.readBoolean ()) ؛ system.out.printf ("readByte (): 0x ٪ s/n" ، bytetoHexString (in.readbyte ())) ؛ System.out.printf ("readchar (): 0x ٪ s/n" ، chartohexstring (in.readchar ())) ؛ System.out.printf ("readshort (): 0x ٪ s/n" ، shorttoHexString (in.readshort ())) ؛ system.out.printf ("readint (): 0x ٪ s/n" ، integer.toHexString (in.Readint ())) ؛ System.out.printf ("readlong (): 0x ٪ s/n" ، long.toHexString (in.readlong ())) ؛ system.out.printf ("readutf (): ٪ s/n" ، in.readutf ()) ؛ in.close () ؛ } catch (fileNotFoundException e) {e.printStackTrace () ؛ } catch (SecurityException e) {E.PrintStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} // اطبع السلسلة السداسية المقابلة لسلسلة البايت الثابتة الثابتة bytetoHexstring (byte val) {return integer.toHexString (val & 0xff) ؛ } // طباعة السلسلة السداسية المقابلة لـ Char private Static String ChartoHexString (char val) {return integer.toHexString (val) ؛ } // طباعة السلسلة السداسية المقابلة لسلسلة ثابتة قصيرة قصيرة شورتويكسسترنج (val) {return integer.toHexString (val & 0xffff) ؛ }} نتائج التشغيل:
BytetoHexstring (0x8f): 0x8fchartohexstring (0x8fcf): 0x8fcfreadBoolean (): truereadbyte (): 0x41readchar (): 0x42 43ReadShort (): 0x4445Readint (): 0x12345678ReadLong (): 0xfedcba987654321Readutf (): ABCDefghijklMnopqrstuvwxyz Yan12