Java_ioシステムのDataInputStream、DataOutputStreamの概要、ソースコードおよび例-08
24987 ワード
Java_ioシステムのDataInputStream、DataOutputStreamの概要、ソースコードおよび例-08
それとも出力ストリームから、このストリームは支払いがあってこそ報われるのか、PipedInputStream、PipedOutputStreamのように1対のオブジェクトを結合して使用しなければならないとは思わないが、DataOutputStreamが宛先にデータを書き込む前に、DataInputStreamを使用してデータをプログラムに読み込み、javaベースタイプに変換する必要がある.
一:DataOutputStream
1、 クラス機能の概要:
データバイト出力ストリーム、DataOutputStreamを紹介する前に1つのクラスFilterOutputStream、1つのインタフェースDataOutput、FilterOutputStreamを紹介する:前述したように、すべての装飾バイト出力ストリームの装飾クラスの親であり、装飾を定義する基準であり、装飾の実現をユーザーに透明化することを意味する.DataOutput:データ出力インタフェース、Javaの様々な元のデータをバイナリバイトストリームに変換する方法を定義し、DataOutputStreamはDataOutput実装クラスとして、DataOutのすべての方法を書き換えた.ここでは、Javaの基礎データ型をデータバイト出力ストリームに書き込み、記憶媒体に保存する、その後、DataInputStreamで記憶媒体からプログラムに読み込んでjavaベースタイプに復元できます.ここでは、DataOutputStream、DataOut、FilterOutputStreamの3つのクラスの関係について、このような設計では装飾器モードとブリッジモードを使用し、クラスの爆発的な増加を回避しています.
2、 DataOutputStream APIの概要:
A:キーフィールド
B:構築方法
C:一般的な方法
3、 ソース分析:
4、 実例:
DataInputStreamを使用して、DataOutputStreamに書き込まれたデータを読み込み、検証するために使用するため、ここでは両方のインスタンスを一緒にデモし、直接下にドラッグしてインスタンスを見ることができます.
二:DataInputStream
1、 クラス機能の概要:
データバイト入力ストリーム、javaのIOシステムが同じ役割を果たすクラスの間に強い対称性があり、ここでは当然ながら、DataInputStreamがFilterInputStreamを継承し、DataInputインタフェースを実現し、FilterInputStream:フィルタバイト入力ストリーム、すべてのワード節入力ストリーム装飾クラスの親クラス、DataInput:DataOutput、頭の中ですぐにデータ入力が現れて、各種の方法を定義して、それぞれバイナリストリームをjava原始基礎タイプに変換することができて、DataInputの実現類DataInputStreamとして、作用はDataOutputStreamを使って目的の地の中のjava基礎タイプのデータをプログラムの中に読み取って、そしてjava基礎タイプに還元して、私達は直接プログラムの中で使用することができます.同様に装飾器、ブリッジの2つの設計モードを使用した.
2、DataInputStream APIの概要:
A:構築方法
B:一般的な方法
3、ソース分析:
4、実例提示:
それとも出力ストリームから、このストリームは支払いがあってこそ報われるのか、PipedInputStream、PipedOutputStreamのように1対のオブジェクトを結合して使用しなければならないとは思わないが、DataOutputStreamが宛先にデータを書き込む前に、DataInputStreamを使用してデータをプログラムに読み込み、javaベースタイプに変換する必要がある.
一:DataOutputStream
1、 クラス機能の概要:
データバイト出力ストリーム、DataOutputStreamを紹介する前に1つのクラスFilterOutputStream、1つのインタフェースDataOutput、FilterOutputStreamを紹介する:前述したように、すべての装飾バイト出力ストリームの装飾クラスの親であり、装飾を定義する基準であり、装飾の実現をユーザーに透明化することを意味する.DataOutput:データ出力インタフェース、Javaの様々な元のデータをバイナリバイトストリームに変換する方法を定義し、DataOutputStreamはDataOutput実装クラスとして、DataOutのすべての方法を書き換えた.ここでは、Javaの基礎データ型をデータバイト出力ストリームに書き込み、記憶媒体に保存する、その後、DataInputStreamで記憶媒体からプログラムに読み込んでjavaベースタイプに復元できます.ここでは、DataOutputStream、DataOut、FilterOutputStreamの3つのクラスの関係について、このような設計では装飾器モードとブリッジモードを使用し、クラスの爆発的な増加を回避しています.
2、 DataOutputStream APIの概要:
A:キーフィールド
protected int wrriten;
private byte[] bytearr; writeUTF(String str) str
B:構築方法
DataOutputStream(OutputStream out); dos
C:一般的な方法
void flush(); dos flush
int size(); dos
synchronized void write(int b); dos
synchronized void write(byte b[], int off, int len); dos
writeBoolean(boolean v); boolean dos
writeByte(int v); dos
writeShort(int v); short dos
void writeChar(int v); dos
void writeInt(int v); dos
void writeLong(long v); long dos
void writeFloat(float v); float dos
void writeDouble(double v); double dos
void writeBytes(String s); dos
void writeChars(String s); dos
void writeUTF(String str); dos
3、 ソース分析:
package com.chy.io.original.code;
import java.io.IOException;
import java.io.UTFDataFormatException;
/**
* DataOutput : java 、 。
* String UTF-8 。
*/
public class DataOutputStream extends FilterOutputStream implements DataOutput {
/**
* 、 、 size() 。
*/
protected int written;
/**
* writeUTF 。
*/
private byte[] bytearr = null;
/**
* OutputStream DataOutputStream dos 、 dos FilterOutputStream 、DataOut 。
* :written = 0 。
*/
public DataOutputStream(OutputStream out) {
super(out);
}
/**
* written 、 int 2 31 -1。
*/
private void incCount(int value) {
int temp = written + value;
if (temp < 0) {
temp = Integer.MAX_VALUE;
}
written = temp;
}
/**
* OutputStream( out) out.write(b) int b out 。
* written + 1。
*/
public synchronized void write(int b) throws IOException {
out.write(b);
incCount(1);
}
/**
* out.write(byte[] b, int off, int len) b off len out 。
* : synchronized、 s 、
* out 、 。
* 、 written + len。
*/
public synchronized void write(byte b[], int off, int len)
throws IOException
{
out.write(b, off, len);
incCount(len);
}
/**
* out flush out 。
*/
public void flush() throws IOException {
out.flush();
}
/**
* boolean out 、written + 1。
*/
public final void writeBoolean(boolean v) throws IOException {
out.write(v ? 1 : 0);
incCount(1);
}
/**
* out 、written + 1。
*/
public final void writeByte(int v) throws IOException {
out.write(v);
incCount(1);
}
/**
* short out、written + 2。
*/
public final void writeShort(int v) throws IOException {
out.write((v >>> 8) & 0xFF);
out.write((v >>> 0) & 0xFF);
incCount(2);
}
/**
* char out、written + 2。
*/
public final void writeChar(int v) throws IOException {
out.write((v >>> 8) & 0xFF);
out.write((v >>> 0) & 0xFF);
incCount(2);
}
/**
* int out、written + 4。
*/
public final void writeInt(int v) throws IOException {
out.write((v >>> 24) & 0xFF);
out.write((v >>> 16) & 0xFF);
out.write((v >>> 8) & 0xFF);
out.write((v >>> 0) & 0xFF);
incCount(4);
}
private byte writeBuffer[] = new byte[8];
/**
* long out、written + 8。
*/
public final void writeLong(long v) throws IOException {
writeBuffer[0] = (byte)(v >>> 56);
writeBuffer[1] = (byte)(v >>> 48);
writeBuffer[2] = (byte)(v >>> 40);
writeBuffer[3] = (byte)(v >>> 32);
writeBuffer[4] = (byte)(v >>> 24);
writeBuffer[5] = (byte)(v >>> 16);
writeBuffer[6] = (byte)(v >>> 8);
writeBuffer[7] = (byte)(v >>> 0);
out.write(writeBuffer, 0, 8);
incCount(8);
}
/**
* float out。
*/
public final void writeFloat(float v) throws IOException {
writeInt(Float.floatToIntBits(v));
}
/**
* double out。
*/
public final void writeDouble(double v) throws IOException {
writeLong(Double.doubleToLongBits(v));
}
/**
* out
* written + s.length();
*/
public final void writeBytes(String s) throws IOException {
int len = s.length();
for (int i = 0 ; i < len ; i++) {
out.write((byte)s.charAt(i));
}
incCount(len);
}
/**
* out
* written + s.lengt()*2;
*/
public final void writeChars(String s) throws IOException {
int len = s.length();
for (int i = 0 ; i < len ; i++) {
int v = s.charAt(i);
out.write((v >>> 8) & 0xFF);
out.write((v >>> 0) & 0xFF);
}
incCount(len * 2);
}
/**
* writeUTF(String str, DataOutput out) out。
*/
public final void writeUTF(String str) throws IOException {
writeUTF(str, this);
}
/**
* out。
*/
static int writeUTF(String str, DataOutput out) throws IOException {
int strlen = str.length();
int utflen = 0;
int c, count = 0;
// UTF-8 1~4 ;
// UTF-8 , UTF-8 。
for (int i = 0; i < strlen; i++) {
c = str.charAt(i);
if ((c >= 0x0001) && (c <= 0x007F)) {
utflen++;
} else if (c > 0x07FF) {
utflen += 3;
} else {
utflen += 2;
}
}
if (utflen > 65535)
throw new UTFDataFormatException(
"encoded string too long: " + utflen + " bytes");
byte[] bytearr = null;
if (out instanceof DataOutputStream) {
DataOutputStream dos = (DataOutputStream)out;
if(dos.bytearr == null || (dos.bytearr.length < (utflen+2)))
dos.bytearr = new byte[(utflen*2) + 2];
bytearr = dos.bytearr;
} else {
bytearr = new byte[utflen+2];
}
// UTF-8 、 str.length + 2 out 。 str dos.size() 。
bytearr[count++] = (byte) ((utflen >>> 8) & 0xFF);
bytearr[count++] = (byte) ((utflen >>> 0) & 0xFF);
int i=0;
for (i=0; i<strlen; i++) {
c = str.charAt(i);
if (!((c >= 0x0001) && (c <= 0x007F))) break;
bytearr[count++] = (byte) c;
}
for (;i < strlen; i++){
c = str.charAt(i);
if ((c >= 0x0001) && (c <= 0x007F)) {
bytearr[count++] = (byte) c;
} else if (c > 0x07FF) {
bytearr[count++] = (byte) (0xE0 | ((c >> 12) & 0x0F));
bytearr[count++] = (byte) (0x80 | ((c >> 6) & 0x3F));
bytearr[count++] = (byte) (0x80 | ((c >> 0) & 0x3F));
} else {
bytearr[count++] = (byte) (0xC0 | ((c >> 6) & 0x1F));
bytearr[count++] = (byte) (0x80 | ((c >> 0) & 0x3F));
}
}
out.write(bytearr, 0, utflen+2);
return utflen + 2;
}
/**
* out 、 int int
*/
public final int size() {
return written;
}
}
4、 実例:
DataInputStreamを使用して、DataOutputStreamに書き込まれたデータを読み込み、検証するために使用するため、ここでは両方のインスタンスを一緒にデモし、直接下にドラッグしてインスタンスを見ることができます.
二:DataInputStream
1、 クラス機能の概要:
データバイト入力ストリーム、javaのIOシステムが同じ役割を果たすクラスの間に強い対称性があり、ここでは当然ながら、DataInputStreamがFilterInputStreamを継承し、DataInputインタフェースを実現し、FilterInputStream:フィルタバイト入力ストリーム、すべてのワード節入力ストリーム装飾クラスの親クラス、DataInput:DataOutput、頭の中ですぐにデータ入力が現れて、各種の方法を定義して、それぞれバイナリストリームをjava原始基礎タイプに変換することができて、DataInputの実現類DataInputStreamとして、作用はDataOutputStreamを使って目的の地の中のjava基礎タイプのデータをプログラムの中に読み取って、そしてjava基礎タイプに還元して、私達は直接プログラムの中で使用することができます.同様に装飾器、ブリッジの2つの設計モードを使用した.
2、DataInputStream APIの概要:
A:構築方法
DataInputStream(InputStream in); dis
B:一般的な方法
int read(byte b[]);
int read(byte b[], int off, int len); len off len b 、
void readFully(byte b[]); b.length byte[] b
void readFully(byte b[], int off, int len) len off len b
int skipBytes(int n); pis n 、
boolean readBoolean(); boolean
byte readByte();
int readUnsignedByte();
short readShort(); short
int readUnsignedShort(); short
char readChar(); char
int readInt(); int
long readLong(); long
float readFloat(); float
double readDouble(); double
String readUTF(); String
static String readUTF(DataInput in); in
3、ソース分析:
package com.chy.io.original.code;
import java.io.DataInput;
import java.io.EOFException;
import java.io.IOException;
import java.io.UTFDataFormatException;
/**
* DataInputStrem 、 、FilterInputStream 、
* InputStream 、DataInputStrem FilterInputStream
* InputStream :
* java 、 DataOutputStream InputStream 。
*
*/
public class DataInputStream extends FilterInputStream implements DataInput {
java.io.DataInputStream
/**
* FilterInputStream 、 InputStream DataInputStream;
*/
public DataInputStream(InputStream in) {
super(in);
}
/**
* readUTF
*/
private byte bytearr[] = new byte[80];
private char chararr[] = new char[80];
/**
* InputStream ( :in) read(byte b ,int off, int len) ;
* : ;
* :in.read(byte[] b)、 、in.read(byte[] b) in.read(byte[]b ,int off, int len) 、 ;
*/
public final int read(byte b[]) throws IOException {
return in.read(b, 0, b.length);
}
/**
* in.read(byte[]b ,int off, int len) len ;
*/
public final int read(byte b[], int off, int len) throws IOException {
return in.read(b, off, len);
}
/**
* readFully(byte[] b,int off, int len) b.length ; DataInput
*/
public final void readFully(byte b[]) throws IOException {
readFully(b, 0, b.length);
}
/**
* in len 、 DataInput
*/
public final void readFully(byte b[], int off, int len) throws IOException {
if (len < 0)
throw new IndexOutOfBoundsException();
int n = 0;
while (n < len) {
int count = in.read(b, off + n, len - n);
if (count < 0)
throw new EOFException();
n += count;
}
}
/**
* in n 、 。
*/
public final int skipBytes(int n) throws IOException {
int total = 0;
int cur = 0;
while ((total<n) && ((cur = (int) in.skip(n-total)) > 0)) {
total += cur;
}
return total;
}
/**
* DataOut writeBoolean 。
*/
public final boolean readBoolean() throws IOException {
//boolean
int ch = in.read();
if (ch < 0)
throw new EOFException();
return (ch != 0);
}
/**
* DataOut writeByte() 、 -128 127( ) 。
* byte、 int、 。
*/
public final byte readByte() throws IOException {
int ch = in.read();
if (ch < 0)
throw new EOFException();
return (byte)(ch);
}
/**
* , (zero-extend) int , , 0 255。
* DataOutput writeByte 0 255 , writeByte 。
*/
public final int readUnsignedByte() throws IOException {
int ch = in.read();
if (ch < 0)
throw new EOFException();
return ch;
}
/**
* short 。
*/
public final short readShort() throws IOException {
int ch1 = in.read();
int ch2 = in.read();
if ((ch1 | ch2) < 0)
throw new EOFException();
return (short)((ch1 << 8) + (ch2 << 0));
}
/**
* , 0 65535 int 。
* DataOutput writeShort 0 65535 , writeShort 。
*/
public final int readUnsignedShort() throws IOException {
int ch1 = in.read();
int ch2 = in.read();
if ((ch1 | ch2) < 0)
throw new EOFException();
return (ch1 << 8) + (ch2 << 0);
}
/**
* char 。
*/
public final char readChar() throws IOException {
int ch1 = in.read();
int ch2 = in.read();
if ((ch1 | ch2) < 0)
throw new EOFException();
return (char)((ch1 << 8) + (ch2 << 0));
}
/**
* int
*/
public final int readInt() throws IOException {
int ch1 = in.read();
int ch2 = in.read();
int ch3 = in.read();
int ch4 = in.read();
if ((ch1 | ch2 | ch3 | ch4) < 0)
throw new EOFException();
return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
}
private byte readBuffer[] = new byte[8];
/**
* 8 long
*/
public final long readLong() throws IOException {
readFully(readBuffer, 0, 8);
return (((long)readBuffer[0] << 56) +
((long)(readBuffer[1] & 255) << 48) +
((long)(readBuffer[2] & 255) << 40) +
((long)(readBuffer[3] & 255) << 32) +
((long)(readBuffer[4] & 255) << 24) +
((readBuffer[5] & 255) << 16) +
((readBuffer[6] & 255) << 8) +
((readBuffer[7] & 255) << 0));
}
/**
* float
*/
public final float readFloat() throws IOException {
return Float.intBitsToFloat(readInt());
}
/**
* 8 double
*/
public final double readDouble() throws IOException {
return Double.longBitsToDouble(readLong());
}
/**
* readUTF(DataInut in)
*/
public final String readUTF() throws IOException {
return readUTF(this);
}
/**
* 、 String
*/
public final static String readUTF(DataInput in) throws IOException {
// “ ” “ short ” :
// DataOutputStream writeUTF(String str) 2
int utflen = in.readUnsignedShort();
byte[] bytearr = null;
char[] chararr = null;
if (in instanceof DataInputStream) {
DataInputStream dis = (DataInputStream)in;
if (dis.bytearr.length < utflen){
dis.bytearr = new byte[utflen*2];
dis.chararr = new char[utflen*2];
}
chararr = dis.chararr;
bytearr = dis.bytearr;
} else {
bytearr = new byte[utflen];
chararr = new char[utflen];
}
int c, char2, char3;
int count = 0;
int chararr_count=0;
in.readFully(bytearr, 0, utflen);
while (count < utflen) {
c = (int) bytearr[count] & 0xff;
if (c > 127) break;
count++;
chararr[chararr_count++]=(char)c;
}
while (count < utflen) {
c = (int) bytearr[count] & 0xff;
switch (c >> 4) {
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
/* 0xxxxxxx*/
count++;
chararr[chararr_count++]=(char)c;
break;
case 12: case 13:
/* 110x xxxx 10xx xxxx*/
count += 2;
if (count > utflen)
throw new UTFDataFormatException(
"malformed input: partial character at end");
char2 = (int) bytearr[count-1];
if ((char2 & 0xC0) != 0x80)
throw new UTFDataFormatException(
"malformed input around byte " + count);
chararr[chararr_count++]=(char)(((c & 0x1F) << 6) |
(char2 & 0x3F));
break;
case 14:
/* 1110 xxxx 10xx xxxx 10xx xxxx */
count += 3;
if (count > utflen)
throw new UTFDataFormatException(
"malformed input: partial character at end");
char2 = (int) bytearr[count-2];
char3 = (int) bytearr[count-1];
if (((char2 & 0xC0) != 0x80) || ((char3 & 0xC0) != 0x80))
throw new UTFDataFormatException(
"malformed input around byte " + (count-1));
chararr[chararr_count++]=(char)(((c & 0x0F) << 12) |
((char2 & 0x3F) << 6) |
((char3 & 0x3F) << 0));
break;
default:
/* 10xx xxxx, 1111 xxxx */
throw new UTFDataFormatException(
"malformed input around byte " + count);
}
}
// The number of chars produced may be less than utflen
return new String(chararr, 0, chararr_count);
}
/**
* 、
*/
public String readLine() throws IOException {
return null;
}
}
4、実例提示:
package com.chy.io.original.test;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* DataInputStream、DataOutputStream 。 。
* @author andyChen
* @version 1.1, 13/11/10
*/
public class DataStreamTest {
private final static byte[] byteArray = {0x61, 0x62, 0x63, 0x64, 0x65};
private static byte[] buff = new byte[5];
private static DataOutputStream dos;
private static DataInputStream dis;
/**
* DataOutputStream : java out 。
*/
public static void testDataOutputStream() throws IOException{
dos = new DataOutputStream(new FileOutputStream(new File("D:\\dos.txt")));
dos.write(0x61);
dos.write(byteArray, 0, 3);
dos.write(byteArray);
dos.writeBoolean(false);
dos.writeByte(0x61);
dos.writeShort(32766);
dos.writeChar("c".charAt(0));
dos.writeInt(214783647);
System.out.println(dos.size());
dos.writeFloat(5.12F);// float 4
dos.writeDouble(55.55);
System.out.println(dos.size());
dos.writeUTF("e");
System.out.println(dos.size());
dos.writeUTF("a b");// 3 、
System.out.println(dos.size());
dos.writeLong(1L);
System.out.println("dos :" + dos.size());
dos.close();
}
/**
*
* DataInputstream : : DataOutputStream 、 、 、
* : DataoutputStream java out 、 、
* DataInputStream 、 。 。
*/
public static void testDataInputStream() throws IOException{
// FileInputStream dis;
dis = new DataInputStream(new FileInputStream(new File("D:\\dos.txt")));
System.out.println(byteToString((byte)dis.read()));
//System.out.println(dis.readUnsignedByte()); 、 、 byte 0 - 255 。
System.out.println(" :" + dis.available());
dis.readFully(buff, 0, 3);
printByteValue(buff);
dis.readFully(buff);
printByteValue(buff);
System.out.println(dis.readBoolean());
System.out.println(byteToString(dis.readByte()));
System.out.println(dis.readShort());
// System.out.println(dis.readUnsignedShort()); readUnsignedByte() 、 。
System.out.println(dis.readChar());
System.out.println(dis.readInt());
System.out.println(dis.readFloat());
System.out.println(dis.readDouble());
/**
* : ? ? ?
* 、 : 、 、 、
* ? ?
* :DataOutputStream writeUTF(String str) 、 String str 、 。
* : DataInputSrteam readUTF() 、 、 str。
*/
System.out.println(dis.readUTF());
System.out.println(dis.readUTF());
System.out.println(dis.readLong());
}
public static void testDataInputStreamSkipByte() throws IOException{
// dos 、 dos 。 、 !
dis = new DataInputStream(new FileInputStream(new File("D:\\dos.txt")));
dis.skip(1);//FileInputStream skip
System.out.println(dis.available());
dis.read(buff, 0, 3);
printByteValue(buff);
dis.skipBytes(5);//DataInputStream
System.out.println(dis.readBoolean());
// dos 、 、ByteArrayInputStream count - pos;
dis.skip(dos.size() + 1);
System.out.println(dis.available());
}
public static void main(String[] args) throws IOException {
testDataOutputStream();
testDataInputStream();
//testDataInputStreamSkipByte();
}
private static void printByteValue(byte[] buf) {
for(byte b : buf){
if(b != 0){
System.out.print(byteToString(b) + " ");
}
}
System.out.println();
}
private static String byteToString(byte b){
byte[] bAray = {b};
return new String (bAray);
}
}
まとめ:
DataInputStream、DataOutputStreamの2つの クラスの は、 バイトストリームを することであり、javaベースデータが やプログラムで に なく できるようにすることであり、DataOutputStreamの は、javaベースタイプのデータルートを のルールに って じバイナリストリームに し、 された ストリームを び すwriteである(byte b)、write(byte[]b,int off,int len)メソッドは、このバイナリストリームをdosに き み、さらに に する.DataInputStreamのコアは、 された バイト ストリームを び すread(byteb)、read(byte[]b,int off,int len)であるソースにdosで き まれたjavaベースデータのバイト のデータをバイト でプログラムに み し、 の ルールに って するjavaベースタイプのデータに します.boolean のデータが「0」または「1」のように「true」または「false」を すために「0」と かれている に ります「true」という は、
すべきは、DataInputStreamが み すバイトは、DataOutputStreamがバイトを き む で み るので、バイトをむやみに み ることはできません.この2つのクラスを しく うには、データを み るタイプの とデータを き むタイプの が することが も です.skipBytesメソッドを する がある は、Datを び すときに に る があります.aOutputStreamがjavaベースタイプに き まれたとき、 ベースタイプが に バイトを めるか、スキップした に のバイトまたは1 のバイトが すjavaベースタイプはどれですか.ここでは、この2つのクラスを しく するには、もちろん、 に たちが しているときにどのように き まれたか、どのように み ればいいかをよく っておく があります.そして、そうではありませんすべての でよく われます.よく う を につけ、あまり わないときにAPIを べればok、
もう つ、その の の です. が のStringを き んだとき、 に み めば、それぞれ み めるのか、どの を み むのか、 じ き みではない をどのように するのか、パラメータを していないのか、プログラムはどのように っていますか. :DataOutputStreamが を き んだとき、どれだけ くなりますか.2バイト、2バイトは き む の さを すために われているので、DataInputStreamを して を み ると、まず に み す の さが み られ、その 、 はこれらのバイトを み ってから み りを し、 み りの を に して します.
その IOコンテンツ:java_ioシステムのディレクトリ