datainputStream
DatainputStreamはデータ入力ストリームです。 FilterInputStreamから継承します。
DatainputStreamは、他の入力ストリームを飾るために使用されます。これにより、「アプリケーションが基礎となる入力ストリームから基本的なJavaデータ型を機械に依存しない方法で読み取ることができます」。アプリケーションは、DataOutputStreamを使用して、DatainputStreamによって読み取られたデータを記述できます。
DatainputStream機能リスト:
datainputStream(inputstream in)final int read(byte []バッファー、intオフセット、int length)final read(byte [] buffer)final boolean readboolean()final char readchar()final double readdouble()final float readdouble()final float readfloat()final bideftly [] dst)final void(bytection int readint()final string readline()final long readlong()final short readshort()final static string readutf()final string readutf()final readunsignedbyte()final readunsignedshort()final int skipbytes(int count)final
サンプルコード:
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.IOException;import java.io.fileenotfoundexception; 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 = new file( "file.txt"); dataoutputStream out = new DataOutputStream(new FileOutputStream(file)); out.writeboolean(true); out.writebyte((byte)0x41); out.writeChar((char)0x4243); out.writeshort((short)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 = new 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()); in.close(); } catch(filenotfoundexception e){e.printstacktrace(); } catch(securityexception e){e.printstacktrace(); } catch(ioexception e){e.printstacktrace(); }} //バイトプライベート静的文字列bytetohexstring(byte val)に対応する16進数文字列を印刷{return integer.tohexstring(val&0xff); } // char static string chartohexstring(char val){return integer.tohexstring(val); } //短いプライベート静的文字列ショートヘックスストリング(short val)に対応する16進数文字列を印刷{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進文字列ソースコードを返します。
private static string bytetohexstring(byte val){return integer.tohexstring(val&0xff);}コードがなぜあるのか考えてみてください。
return integer.tohexstring(val&0xff);
その代わり
return integer.tohexstring(val);
まず、bytetohexstring((byte)0x8f)の出力結果を見てみましょう。上記の2つの場合。
return integer.tohexstring(val&0xff);対応する出力は「0xffffff8f」です
return integer.tohexstring(val);対応する出力は「0x8F」です
なぜこれが起こっているのですか?
その理由は実際には非常に単純であり、「バイトタイプをINTタイプに変換する」ことによって引き起こされる問題です。
バイトタイプの0x8Fは負の数であり、その対応するバイナリは10001111です。負の数バイトをINTタイプに変換すると、署名された変換が実行されます(新しいビットには、署名されたビットの数で満たされます)。 0x8Fのサインビットは1です。なぜなら、それをintに変換すると、「1」で満たされているためです。変換後の結果(バイナリ)は11111111111111111111111111111111111111111111111111111111111100111111111111111111111111111001111です。
integer.tohexstring(val)を実行すると、返されたのは0xffffff8fであるためです。
integer.tohexstring(val&0xff)では、0xffffff8f&0xffに相当し、結果は0x8fです。
(3)charおよびshortに対応する16進列の文字列を返します。 「charに対応する16進文字列を返す」に対応するソースコードは次のとおりです。
private static string chartohexstring(char val){return integer.tohexstring(val);} 「短いことに対応する16進文字列を返す」は、次のようにソースコードに対応しています。
private static string shorttohexstring(short val){return integer.tohexstring(val&0xffff);}上記の2つの関数を比較すると、1つが「val」であり、もう1つは「val&0xffff」であるのですか?
(2)の分析を通じて、「短いことに対応する16分の16分の文字列を返す」ことが「val&0xffff」を実行することである理由を同様に推測します。
ただし、「charに対応する16進文字列を返す」場合、「val」を実行する必要があるのはなぜですか」。その理由も非常に簡単です。 Javaでは、Charは署名されていないタイプで、2バイトを占めています。 charをintタイプに変換し、符号なしの変換を実行し、0が入力されているすべてを追加します。
DataOutputStream
DataOutputStreamはデータ出力ストリームです。 FilterOutputStreamから継承します。
DataOutputStreamは、DataOutputStreamおよびDatainputStream入力ストリームを使用して、他の出力ストリームを飾るために使用され、「アプリケーションが基礎となる入力ストリームから基本的なJavaデータタイプをマシンに依存しない方法で読み書きできます。」
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.IOException;import java.io.fileenotfoundexception; 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 = new file( "file.txt"); dataoutputStream out = new DataOutputStream(new FileOutputStream(file)); out.writeboolean(true); out.writebyte((byte)0x41); out.writeChar((char)0x4243); out.writeshort((short)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 = new 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()); in.close(); } catch(filenotfoundexception e){e.printstacktrace(); } catch(securityexception e){e.printstacktrace(); } catch(ioexception e){e.printstacktrace(); }} //バイトプライベート静的文字列bytetohexstring(byte val)に対応する16進数文字列を印刷{return integer.tohexstring(val&0xff); } // char static string chartohexstring(char val){return integer.tohexstring(val); } //短いプライベート静的文字列ショートヘックスストリング(short val)に対応する16進数文字列を印刷{return integer.tohexstring(val&0xffff); }}実行結果:
bytetohexstring(0x8f):0x8fchartohexstring(0x8fcf):0x8fcfreadboolean():truereadbyte():0x41readchar():0x42 43ReadShort():0x4445ReadInt():0x12345678Readlong():0xfedcba987654321readutf():abcdefghijklmnopqrstuvwxyz YAN12