자바 io 시리즈 15 의 DataOutputStream (데이터 출력 흐름) 의 인지, 소스 코드 와 예제

이 장 에 서 는 DataOutputStream 을 소개 합 니 다.우 리 는 먼저 DataOutputStream 에 대해 대체적인 인식 을 가지 고 그 소스 코드 를 깊이 공부 한 다음 에 예 시 를 통 해 그것 에 대한 이 해 를 깊이 있 게 한다.
전재 출처 를 밝 혀 주 십시오:http://www.cnblogs.com/skywang12345/p/io_15.html
DataOutput Stream 소개
DataOutput Stream 은 데이터 출력 흐름 입 니 다.그것 은 FilterOutputStream 에 계승 되 었 다.DataOutputStream 은 다른 출력 흐름 을 장식 하 는 데 사용 되 며, DataOutputStream 과 DataInputStream 입력 흐름 을 결합 하여 사용 합 니 다. "응용 프로그램 이 기계 와 무관 한 방식 으로 바 텀 입력 흐름 에서 기본 자바 데이터 형식 을 읽 고 쓸 수 있 도록 합 니 다."
DataOutput Stream 소스 코드 분석 (jdk 1.7.40 기반)
  1 package java.io;
  2 
  3 public class DataOutputStream extends FilterOutputStream implements DataOutput {
  4     // “     ”    
  5     protected int written;
  6 
  7     // “     ”       
  8     private byte[] bytearr = null;
  9 
 10     //     
 11     public DataOutputStream(OutputStream out) {
 12         super(out);
 13     }
 14 
 15     //   “   ”
 16     private void incCount(int value) {
 17         int temp = written + value;
 18         if (temp < 0) {
 19             temp = Integer.MAX_VALUE;
 20         }
 21         written = temp;
 22     }
 23 
 24     //  int       “     ” 
 25     public synchronized void write(int b) throws IOException {
 26         out.write(b);
 27         incCount(1);
 28     }
 29 
 30     //      b off   len   ,    “     ” 
 31     public synchronized void write(byte b[], int off, int len)
 32         throws IOException
 33     {
 34         out.write(b, off, len);
 35         incCount(len);
 36     }
 37 
 38     //
 39     public void flush() throws IOException {
 40         out.flush();
 41     }
 42 
 43     //  boolean       “     ” 
 44     public final void writeBoolean(boolean v) throws IOException {
 45         out.write(v ? 1 : 0);
 46         incCount(1);
 47     }
 48 
 49     //  byte       “     ” 
 50     public final void writeByte(int v) throws IOException {
 51         out.write(v);
 52         incCount(1);
 53     }
 54 
 55     //  short       “     ” 
 56     //   :short 2   
 57     public final void writeShort(int v) throws IOException {
 58         //    short 8       
 59         out.write((v >>> 8) & 0xFF);
 60         //    short 8       
 61         out.write((v >>> 0) & 0xFF);
 62         incCount(2);
 63     }
 64 
 65     //  char       “     ” 
 66     //   :char 2   
 67     public final void writeChar(int v) throws IOException {
 68         //    char 8       
 69         out.write((v >>> 8) & 0xFF);
 70         //    char 8       
 71         out.write((v >>> 0) & 0xFF);
 72         incCount(2);
 73     }
 74 
 75     //  int       “     ” 
 76     //   :int 4   
 77     public final void writeInt(int v) throws IOException {
 78         out.write((v >>> 24) & 0xFF);
 79         out.write((v >>> 16) & 0xFF);
 80         out.write((v >>>  8) & 0xFF);
 81         out.write((v >>>  0) & 0xFF);
 82         incCount(4);
 83     }
 84 
 85     private byte writeBuffer[] = new byte[8];
 86 
 87     //  long       “     ” 
 88     //   :long 8   
 89     public final void writeLong(long v) throws IOException {
 90         writeBuffer[0] = (byte)(v >>> 56);
 91         writeBuffer[1] = (byte)(v >>> 48);
 92         writeBuffer[2] = (byte)(v >>> 40);
 93         writeBuffer[3] = (byte)(v >>> 32);
 94         writeBuffer[4] = (byte)(v >>> 24);
 95         writeBuffer[5] = (byte)(v >>> 16);
 96         writeBuffer[6] = (byte)(v >>>  8);
 97         writeBuffer[7] = (byte)(v >>>  0);
 98         out.write(writeBuffer, 0, 8);
 99         incCount(8);
100     }
101 
102     //  float       “     ” 
103     public final void writeFloat(float v) throws IOException {
104         writeInt(Float.floatToIntBits(v));
105     }
106 
107     //  double       “     ” 
108     public final void writeDouble(double v) throws IOException {
109         writeLong(Double.doubleToLongBits(v));
110     }
111 
112     //  String       “     ” 
113     //      ,  String          byte         。
114     public final void writeBytes(String s) throws IOException {
115         int len = s.length();
116         for (int i = 0 ; i < len ; i++) {
117             out.write((byte)s.charAt(i));
118         }
119         incCount(len);
120     }
121 
122     //  String       “     ” 
123     //      ,  String          char         。
124     public final void writeChars(String s) throws IOException {
125         int len = s.length();
126         for (int i = 0 ; i < len ; i++) {
127             int v = s.charAt(i);
128             out.write((v >>> 8) & 0xFF);
129             out.write((v >>> 0) & 0xFF);
130         }
131         incCount(len * 2);
132     }
133 
134     //  UTF-8       “     ” 
135     public final void writeUTF(String str) throws IOException {
136         writeUTF(str, this);
137     }
138 
139     //  String   UTF-8        “   out” 
140     static int writeUTF(String str, DataOutput out) throws IOException {
141         //  String   
142         int strlen = str.length();
143         int utflen = 0;
144         int c, count = 0;
145 
146         //   UTF-8 1~4     ;
147         //   ,  UTF-8      ,  UTF-8      。
148         for (int i = 0; i < strlen; i++) {
149             c = str.charAt(i);
150             if ((c >= 0x0001) && (c <= 0x007F)) {
151                 utflen++;
152             } else if (c > 0x07FF) {
153                 utflen += 3;
154             } else {
155                 utflen += 2;
156             }
157         }
158 
159         if (utflen > 65535)
160             throw new UTFDataFormatException(
161                 "encoded string too long: " + utflen + " bytes");
162 
163         //   “    bytearr”
164         byte[] bytearr = null;
165         if (out instanceof DataOutputStream) {
166             DataOutputStream dos = (DataOutputStream)out;
167             if(dos.bytearr == null || (dos.bytearr.length < (utflen+2)))
168                 dos.bytearr = new byte[(utflen*2) + 2];
169             bytearr = dos.bytearr;
170         } else {
171             bytearr = new byte[utflen+2];
172         }
173 
174         // “    ”  2       “UTF-8     ”
175         bytearr[count++] = (byte) ((utflen >>> 8) & 0xFF);
176         bytearr[count++] = (byte) ((utflen >>> 0) & 0xFF);
177 
178         //  UTF-8            
179         int i=0;
180         for (i=0; i<strlen; i++) {
181            c = str.charAt(i);
182            if (!((c >= 0x0001) && (c <= 0x007F))) break;
183            bytearr[count++] = (byte) c;
184         }
185 
186         //
187         for (;i < strlen; i++){
188             c = str.charAt(i);
189             // UTF-8   1      
190             if ((c >= 0x0001) && (c <= 0x007F)) {
191                 bytearr[count++] = (byte) c;
192 
193             } else if (c > 0x07FF) {
194                 // UTF-8   3      
195                 bytearr[count++] = (byte) (0xE0 | ((c >> 12) & 0x0F));
196                 bytearr[count++] = (byte) (0x80 | ((c >>  6) & 0x3F));
197                 bytearr[count++] = (byte) (0x80 | ((c >>  0) & 0x3F));
198             } else {
199                 // UTF-8   2      
200                 bytearr[count++] = (byte) (0xC0 | ((c >>  6) & 0x1F));
201                 bytearr[count++] = (byte) (0x80 | ((c >>  0) & 0x3F));
202             }
203         }
204         //         “     ” 
205         out.write(bytearr, 0, utflen+2);
206         return utflen + 2;
207     }
208 
209     public final int size() {
210         return written;
211     }
212 }

예제 코드
DataOutStream 의 API 에 대한 자세 한 용법 은 예제 코드 (DataInputStreamTest. 자바) 를 참조 하 십시오.
  1 import java.io.DataInputStream;
  2 import java.io.DataOutputStream;
  3 import java.io.ByteArrayInputStream;
  4 import java.io.File;
  5 import java.io.InputStream;
  6 import java.io.FileInputStream;
  7 import java.io.FileOutputStream;
  8 import java.io.IOException;
  9 import java.io.FileNotFoundException;
 10 import java.lang.SecurityException;
 11 
 12 /**
 13  * DataInputStream   DataOutputStream    
 14  *
 15  * @author skywang
 16  */
 17 public class DataInputStreamTest {
 18 
 19     private static final int LEN = 5;
 20 
 21     public static void main(String[] args) {
 22         //   DataOutputStream,          。
 23         testDataOutputStream() ;
 24         //   DataInputStream,              。
 25         testDataInputStream() ;
 26     }
 27 
 28     /**
 29      * DataOutputStream API    
 30      */
 31     private static void testDataOutputStream() {
 32 
 33         try {
 34             File file = new File("file.txt");
 35             DataOutputStream out =
 36                   new DataOutputStream(
 37                       new FileOutputStream(file));
 38 
 39             out.writeBoolean(true);
 40             out.writeByte((byte)0x41);
 41             out.writeChar((char)0x4243);
 42             out.writeShort((short)0x4445);
 43             out.writeInt(0x12345678);
 44             out.writeLong(0x0FEDCBA987654321L);
 45 
 46             out.writeUTF("abcdefghijklmnopqrstuvwxyz 12");
 47 
 48             out.close();
 49        } catch (FileNotFoundException e) {
 50            e.printStackTrace();
 51        } catch (SecurityException e) {
 52            e.printStackTrace();
 53        } catch (IOException e) {
 54            e.printStackTrace();
 55        }
 56     }
 57     /**
 58      * DataInputStream API    
 59      */
 60     private static void testDataInputStream() {
 61 
 62         try {
 63             File file = new File("file.txt");
 64             DataInputStream in =
 65                   new DataInputStream(
 66                       new FileInputStream(file));
 67 
 68             System.out.printf("byteToHexString(0x8F):0x%s
", byteToHexString((byte)0x8F)); 69 System.out.printf("charToHexString(0x8FCF):0x%s
", charToHexString((char)0x8FCF)); 70 71 System.out.printf("readBoolean():%s
", in.readBoolean()); 72 System.out.printf("readByte():0x%s
", byteToHexString(in.readByte())); 73 System.out.printf("readChar():0x%s
", charToHexString(in.readChar())); 74 System.out.printf("readShort():0x%s
", shortToHexString(in.readShort())); 75 System.out.printf("readInt():0x%s
", Integer.toHexString(in.readInt())); 76 System.out.printf("readLong():0x%s
", Long.toHexString(in.readLong())); 77 System.out.printf("readUTF():%s
", in.readUTF()); 78 79 in.close(); 80 } catch (FileNotFoundException e) { 81 e.printStackTrace(); 82 } catch (SecurityException e) { 83 e.printStackTrace(); 84 } catch (IOException e) { 85 e.printStackTrace(); 86 } 87 } 88 89 // byte 16 90 private static String byteToHexString(byte val) { 91 return Integer.toHexString(val & 0xff); 92 } 93 94 // char 16 95 private static String charToHexString(char val) { 96 return Integer.toHexString(val); 97 } 98 99 // short 16 100 private static String shortToHexString(short val) { 101 return Integer.toHexString(val & 0xffff); 102 } 103 }

실행 결과:
byteToHexString (0x8F): 0x8fcharToHexString (0x8FCF): 0x8fcfreadBoolean (): truereadByte (): 0x41readChar (): 0x4243readShort (): 0x4445readInt (): 0x12345678readLong (): 0xfedcba987654321readUTF (): abcdefghijklmnopqrstuvwxyz 엄 12
결과 설명:
"자바 io 시리즈 14 의 DataInputStream (데이터 입력 흐름) 의 인지, 소스 코드 와 예제" 참조

좋은 웹페이지 즐겨찾기