DatainputStream
DatainputStream은 데이터 입력 스트림입니다. FilterInputStream에서 상속됩니다.
DatainputStream은 다른 입력 스트림을 장식하는 데 사용되며, "애플리케이션이 기본 입력 스트림에서 기본 입력 스트림에서 기본 Java 데이터 유형을 읽을 수 있습니다." 응용 프로그램은 DataOutputStream을 사용하여 DatainputStream에서 읽은 데이터를 작성할 수 있습니다.
DatainputStream 함수 목록 :
DatainputStream (InputStream in) 최종 int read (byte [] buffer, int offset, int length) 최종 int read (byte [] buffer) Final Boolean readboolean () 최종 byte readbyte () 최종 char readbyte () 최종 char readbyte () 최종 readdouble () Final Float Readfloat () 최종 void (byte [] dst) 최종 void는 최종 최종 voide (byte [] dst, inteT, intecet) 최종 voide (byte [] dst, int inteT, int int int int int int). readInt () 최종 문자열 readline () 최종 long readlong () 최종 짧은 readshort () 최종 정적 문자열 readUtf (datainput in) 최종 문자열 readUtf () 최종 int readUnsignedByte () 최종 int readUnsignedShort () 최종 int skipbytes (int count)
샘플 코드 :
DatainputStream에서 API의 상세 사용에 대해 :
import java.io.datainputStream; import java.io.dataOutputStream; import java.io.BytearRayinputStream; import java.io.file; import java.io.inputStream; import java.io.fileInputStream; import java.io.fileOutputStream; import java.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io java.io.filenotfoundException; import java.lang.securityException;/** * DatainputStream 및 DataOutputStream 테스트 프로그램 * * @Author Skywang */public class datainputStreamTest {private static final int len = 5; public static void main (string [] args) {// dataOutputStream을 테스트하고 출력 스트림에 데이터를 씁니다. testDataOutputStream (); // 위의 출력 스트림 결과에서 데이터를 읽으려면 DataInputStream을 테스트합니다. testDatainputStream (); } / *** DataOutputStream API 테스트 함수* / private static void testDataOutputStream () {try {file file = 새 파일 ( "file.txt"); dataOutputStream out = new DataOutputStream (new FileOutputStream (file)); out.writeboolean (true); out.writeByte ((바이트) 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.txt"); datainputStream in = new DatainputStream (new FileInputStream (file)); 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 ()); 넣다(); } catch (filenotfoundException e) {e.printstacktrace (); } catch (SecurityException e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); }} // BYTE 개인 정적 문자열 BYTETOHEXSTRING (BYTE VAL)에 해당하는 16 진 문자열 인쇄 {return integer.toHexString (val & 0xff); } // char private static string chartohexstring (char val) {return integer.tohexstring (val)에 해당하는 16 진 문자열을 인쇄합니다. } // 짧은 개인 정적 문자열에 해당하는 16 진 문자열 인쇄 (짧은 val) {return integer.tohexstring (val & 0xffff); }} 실행 결과 :
BYTETOHEXSTRING (0X8F) : 0x8FCHARTOHEXSTRING (0x8FCF) : 0x8FCFREADBoolean () : trueReadByte () : 0x41readchar () : 0x42 43readshort () : 0x4445readint () : 0x12345678readlong () : 0xfedcba987654321readutf () : abcdefghijklmnopqrstuvwxyz YAN12
결과 설명 :
(1) file.txt 텍스트를 봅니다. 16 진수 데이터는 다음과 같이 표시됩니다.
001f의 해당 INT 값은 31입니다. 이는 다음과 같은 UTF-8 데이터의 길이를 의미합니다. 문자의 길이 "abcdefghijklmnopqrstuvwxyz yan12"의 길이는 26이고, "门"에 해당하는 UTF-8 데이터의 길이는 3이고; "12"의 길이는 2입니다. 총 길이 = 26+3+2 = 31입니다.
(2) 바이트에 해당하는 16 진 문자열 소스 코드를 반환합니다.
개인 정적 문자열 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"로 채워져 있기 때문입니다. 변환 후 결과 (바이너리)는 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111음까지 해당 결과입니다.
우리가 integer.tohexstring (val)을 실행할 때 반환 된 것은 0xffffff8f입니다.
integer.tohexstring (val & 0xff)에서는 0xffffff8f & 0xff와 동일하며 결과는 0x8f입니다.
(3) Char 및 Short에 해당하는 16 진수를 반환합니다. "char에 해당하는 16 진 문자열을 반환"에 해당하는 소스 코드는 다음과 같습니다.
비공개 정적 문자열 ChartoHexString (char val) {return integer.toHexString (val);} "단락에 해당하는 16 진수 문자열을 반환하십시오"는 다음과 같이 소스 코드에 해당합니다.
개인 정적 문자열 shorttoHexString (짧은 val) {return integer.toHexString (val & 0xffff);} 위의 두 기능을 비교하면 왜 하나는 "val"이고 다른 하나는 "val & 0xffff"입니까?
(2)의 분석을 통해, 우리는 "짧은에 해당하는 16 진 문자열을 반환하는"이유를 유사하게 추론합니다.
그러나 "char에 해당하는 16 진수 문자열을 반환하는 경우"Val "을 실행 해야하는 이유는 무엇입니까? 그 이유는 또한 매우 간단합니다. Java에서 Char는 서명되지 않은 유형이며 두 바이트를 설명합니다. char를 int 유형으로 변환하고, 서명되지 않은 변환을 수행하며, 모두 0으로 채워진 모든 것을 추가합니다.
DataOutputStream
DataOutputStream은 데이터 출력 스트림입니다. FilterOutputStream에서 상속됩니다.
DataOutputStream은 DataOutputStream 및 DataInputStream 입력 스트림을 사용하여 다른 출력 스트림을 장식하는 데 사용됩니다.
DataOutstream에서 API의 자세한 사용을위한 샘플 코드 :
import java.io.datainputStream; import java.io.dataOutputStream; import java.io.BytearRayinputStream; import java.io.file; import java.io.inputStream; import java.io.fileInputStream; import java.io.fileOutputStream; import java.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io.io java.io.filenotfoundException; import java.lang.securityException;/** * DatainputStream 및 DataOutputStream 테스트 프로그램 * * @Author Skywang */public class datainputStreamTest {private static final int len = 5; public static void main (string [] args) {// dataOutputStream을 테스트하고 출력 스트림에 데이터를 씁니다. testDataOutputStream (); // 위의 출력 스트림 결과에서 데이터를 읽으려면 DataInputStream을 테스트합니다. testDatainputStream (); } / *** DataOutputStream API 테스트 함수* / private static void testDataOutputStream () {try {file file = 새 파일 ( "file.txt"); dataOutputStream out = new DataOutputStream (new FileOutputStream (file)); out.writeboolean (true); out.writeByte ((바이트) 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.txt"); datainputStream in = new DatainputStream (new FileInputStream (file)); 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 ()); 넣다(); } catch (filenotfoundException e) {e.printstacktrace (); } catch (SecurityException e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); }} // BYTE 개인 정적 문자열 BYTETOHEXSTRING (BYTE VAL)에 해당하는 16 진 문자열 인쇄 {return integer.toHexString (val & 0xff); } // char private static string chartohexstring (char val) {return integer.tohexstring (val)에 해당하는 16 진 문자열을 인쇄합니다. } // 짧은 개인 정적 문자열에 해당하는 16 진 문자열 인쇄 (짧은 val) {return integer.tohexstring (val & 0xffff); }} 실행 결과 :
BYTETOHEXSTRING (0X8F) : 0x8FCHARTOHEXSTRING (0x8FCF) : 0x8FCFREADBoolean () : trueReadByte () : 0x41readchar () : 0x42 43readshort () : 0x4445readint () : 0x12345678readlong () : 0xfedcba987654321readutf () : abcdefghijklmnopqrstuvwxyz YAN12