datainputStream
DatainputStream เป็นสตรีมอินพุตข้อมูล มันสืบทอดมาจาก FilterInputStream
DatainputStream ใช้ในการตกแต่งสตรีมอินพุตอื่น ๆ ซึ่ง "อนุญาตให้แอปพลิเคชันอ่านประเภทข้อมูล Java พื้นฐานจากสตรีมอินพุตพื้นฐานในลักษณะที่ไม่ขึ้นกับเครื่อง" แอปพลิเคชันสามารถใช้ DataOutputStream เพื่อเขียนข้อมูลที่อ่านโดย DatainputStream
รายการฟังก์ชั่น DatainputStream:
datainputStream (inputstream in) int final read (byte [] buffer, int offset, ความยาว int) int สุดท้ายอ่าน (byte [] buffer) boolean final boolean readboolean () byte final final readbyte () readchar readchar () สุดท้าย Readint () Final String Readline () Final Long Readlong () Final Final Short Readshort () สตริงคงที่สุดท้าย readutf (datainput in) สตริงสุดท้าย readutf () int final int ReadunsignedByte () int final intunsignedshort () int skipbytes ขั้นสุดท้าย (int count)
รหัสตัวอย่าง:
เกี่ยวกับการใช้งานโดยละเอียดของ API ใน DatainputStream:
นำเข้า java.io.datainputstream; นำเข้า java.io.dataOutputstream; นำเข้า java.io.ByTearrayInputStream; นำเข้า java.io.file; นำเข้า java.io.Inputstream; นำเข้า Java.io.fileinputstream; java.io.filenotfoundexception; นำเข้า java.lang.securityException;/** * โปรแกรมทดสอบ DatainputStream และ DataOutputStream * * @author Skywang */คลาสสาธารณะ DatainputStreamTest โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// ทดสอบ dataOutputStream และเขียนข้อมูลไปยังสตรีมเอาต์พุต testDataOutputStream (); // ทดสอบ datainputStream เพื่ออ่านข้อมูลจากผลลัพธ์สตรีมเอาต์พุตด้านบน TestDatainputStream (); } / *** ฟังก์ชั่นทดสอบ API DataOutputStream* / Void Private Void TestDataOutputStream () {ลอง {ไฟล์ไฟล์ = ไฟล์ใหม่ ("file.txt"); dataOrtputStream out = new dataOutputStream (ใหม่ fileOutputStream (ไฟล์)); out.writeboolean (จริง); out.writeByte ((ไบต์) 0x41); out.writechar ((ถ่าน) 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 Test Function * / Private Static Void TestDatainputStream () {ลอง {ไฟล์ไฟล์ = ไฟล์ใหม่ ("file.txt"); datainputStream ใน = ใหม่ datainputStream (ใหม่ FileInputStream (ไฟล์)); System.out.printf ("bytetohexstring (0x8f): 0x%s/n", bytetohexstring ((ไบต์) 0x8f)); System.out.printf ("chartohexstring (0x8fcf): 0x%s/n", chartohexstring ((ถ่าน) 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 (); }} // พิมพ์สตริง hexadecimal ที่สอดคล้องกับ BYTE Private Static String BytetoHexstring (BYTE VAL) {return Integer.toHexstring (val & 0xff); } // พิมพ์สตริง hexadecimal ที่สอดคล้องกับ char chart chartohexstring (char val) {return integer.tohexstring (val); } // พิมพ์สตริง hexadecimal ที่สอดคล้องกับสตริงคงส่วนตัวสั้น ๆ สั้น ๆ shorttohexstring (สั้น Val) {return integer.tohexstring (val & 0xffff); - ผลการทำงาน:
BytetoHexstring (0x8f): 0x8fchartohexstring (0x8fcf): 0x8fcfreadboolean (): truereadbyte (): 0x41readcharchar (): 0x42 43ReadShort (): 0x4445ReadInt (): 0x12345678ReadLong (): 0xfedcBa987654321ReadUtf (): abcdefghijklmnopqrstuvwxyz Yan12
ผลลัพธ์คำอธิบาย:
(1) ดู File.txt Text ข้อมูลเลขฐานสิบหกจะแสดงดังนี้:
ค่า int ที่สอดคล้องกันของ 001F คือ 31 หมายถึงความยาวของข้อมูล UTF-8 ที่ตามมา ความยาวของตัวอักษร "abcdefghijklmnopqrstuvwxyz yan12" คือ 26 และความยาวของข้อมูล UTF-8 ที่สอดคล้องกับ "门" คือ 3; ความยาวของ "12" คือ 2. ความยาวทั้งหมด = 26+3+2 = 31
(2) ส่งคืนซอร์สโค้ดสตริง hexadecimal ที่สอดคล้องกับ BYTE มีดังนี้:
สตริงคงที่ส่วนตัว bytetohexstring (byte val) {return integer.tohexstring (val & 0xff);} ลองคิดดูว่าทำไมรหัสถึง:
return integer.tohexstring (val & 0xff);
แทน
return integer.tohexstring (val);
ก่อนอื่นให้ดูผลลัพธ์ผลลัพธ์ของ Bytetohexstring ((BYTE) 0x8F); ในสองกรณีข้างต้น
return integer.tohexstring (val & 0xff); เอาต์พุตที่สอดคล้องกันคือ "0xffffff8f"
return integer.tohexstring (val); เอาต์พุตที่สอดคล้องกันคือ "0x8f"
ทำไมสิ่งนี้ถึงเกิดขึ้น?
เหตุผลนั้นง่ายมากมันเป็นปัญหาที่เกิดจาก "การแปลงประเภทไบต์เป็นประเภท int"
0x8f ของประเภทไบต์เป็นจำนวนลบและไบนารีที่สอดคล้องกันคือ 10001111; เมื่อแปลงไบต์จำนวนลบเป็นประเภท int การแปลงที่ลงนามจะดำเนินการ (บิตใหม่จะเต็มไปด้วยจำนวนบิตที่ลงนาม) บิตสัญญาณของ 0x8f คือ 1 เพราะเมื่อแปลงเป็น int มันจะเต็มไปด้วย "1"; ผลลัพธ์หลังจากการแปลง (ไบนารี) คือ 11111111111111111111111111111111111111111111111111111111111001111111111111111111111111111111111111111001111111
เพราะเมื่อเราดำเนินการ Integer.tohexstring (val);, การส่งคืนคือ 0xffffff8f
ใน Integer.tohexstring (Val & 0xff) มันเทียบเท่ากับ 0xffffff8f & 0xff และผลลัพธ์คือ 0x8f
(3) ส่งคืนสตริงเลขฐานสิบหกที่สอดคล้องกับถ่านและสั้น ซอร์สโค้ดที่สอดคล้องกับ "ส่งคืนสตริงเลขฐานสิบหกที่สอดคล้องกับถ่าน" มีดังนี้:
String String ส่วนตัว Chartohexstring (Char Val) {return integer.tohexstring (val);} "ส่งคืนสตริงเลขฐานสิบหกที่สอดคล้องกับระยะสั้น" สอดคล้องกับซอร์สโค้ดดังนี้:
สตริงคงที่ส่วนตัว ShorttoHexstring (สั้น) {return integer.tohexstring (val & 0xffff);} การเปรียบเทียบทั้งสองฟังก์ชั่นข้างต้นทำไมหนึ่งจึงเป็น "val" และอีกอย่างคือ "val & 0xffff"?
ผ่านการวิเคราะห์ของ (2) เราอนุมานได้ในทำนองเดียวกันว่าทำไม "ส่งคืนสตริงเลขฐานสิบหกที่สอดคล้องกับสั้น" คือการดำเนินการ "Val & 0xffff"
อย่างไรก็ตามทำไมคุณต้องดำเนินการ "val" ถ้าคุณ "ส่งคืนสตริงเลขฐานสิบหกที่สอดคล้องกับถ่าน" เหตุผลก็ง่ายมาก ใน Java Char เป็นประเภทที่ไม่ได้ลงนามคิดเป็นสองไบต์ แปลงถ่านเป็นประเภท int ทำการแปลงที่ไม่ได้ลงนามและเพิ่มทั้งหมดที่มีประชากร 0
dataOutputStream
DataOrtputStream เป็นสตรีมเอาท์พุทข้อมูล มันสืบทอดมาจาก FilterOutputStream
DataOrtputStream ใช้ในการตกแต่งสตรีมเอาต์พุตอื่น ๆ โดยใช้สตรีมอินพุต DataOutputStream และ DatainputStream "ช่วยให้แอปพลิเคชันสามารถอ่านและเขียนชนิดข้อมูล Java พื้นฐานจากสตรีมอินพุตพื้นฐานในลักษณะที่ไม่ขึ้นกับเครื่องจักร"
รหัสตัวอย่างสำหรับการใช้งานโดยละเอียดของ API ใน DataOutStream:
นำเข้า java.io.datainputstream; นำเข้า java.io.dataOutputstream; นำเข้า java.io.ByTearrayInputStream; นำเข้า java.io.file; นำเข้า java.io.Inputstream; นำเข้า Java.io.fileinputstream; java.io.filenotfoundexception; นำเข้า java.lang.securityException;/** * โปรแกรมทดสอบ DatainputStream และ DataOutputStream * * @author Skywang */คลาสสาธารณะ DatainputStreamTest โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// ทดสอบ dataOutputStream และเขียนข้อมูลไปยังสตรีมเอาต์พุต testDataOutputStream (); // ทดสอบ datainputStream เพื่ออ่านข้อมูลจากผลลัพธ์สตรีมเอาต์พุตด้านบน TestDatainputStream (); } / *** ฟังก์ชั่นทดสอบ API DataOutputStream* / Void Private Void TestDataOutputStream () {ลอง {ไฟล์ไฟล์ = ไฟล์ใหม่ ("file.txt"); dataOrtputStream out = new dataOutputStream (ใหม่ fileOutputStream (ไฟล์)); out.writeboolean (จริง); out.writeByte ((ไบต์) 0x41); out.writechar ((ถ่าน) 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 Test Function * / Private Static Void TestDatainputStream () {ลอง {ไฟล์ไฟล์ = ไฟล์ใหม่ ("file.txt"); datainputStream ใน = ใหม่ datainputStream (ใหม่ FileInputStream (ไฟล์)); System.out.printf ("bytetohexstring (0x8f): 0x%s/n", bytetohexstring ((ไบต์) 0x8f)); System.out.printf ("chartohexstring (0x8fcf): 0x%s/n", chartohexstring ((ถ่าน) 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 (); }} // พิมพ์สตริง hexadecimal ที่สอดคล้องกับ BYTE Private Static String BytetoHexstring (BYTE VAL) {return Integer.toHexstring (val & 0xff); } // พิมพ์สตริง hexadecimal ที่สอดคล้องกับ char chart chartohexstring (char val) {return integer.tohexstring (val); } // พิมพ์สตริง hexadecimal ที่สอดคล้องกับสตริงคงส่วนตัวสั้น ๆ สั้น ๆ shorttohexstring (สั้น Val) {return integer.tohexstring (val & 0xffff); - ผลการทำงาน:
BytetoHexstring (0x8f): 0x8fchartohexstring (0x8fcf): 0x8fcfreadboolean (): truereadbyte (): 0x41readcharchar (): 0x42 43ReadShort (): 0x4445ReadInt (): 0x12345678ReadLong (): 0xfedcBa987654321ReadUtf (): abcdefghijklmnopqrstuvwxyz Yan12