大神們好,我是新手小白,今天在學(xué)習(xí)Java的IO操作中遇到一個百思不得其解的問題,下面的代碼是今天做的關(guān)于DataInputStream類的練習(xí),我很不解為什么DataInputStream的readUTF方法不需要任何參數(shù),但是卻在讀取的時候可以知道自己讀取多長,不明白他是怎么知道我當(dāng)初在寫入的時候?qū)懭氲拈L度的,他是靠什么控制讀取的范圍的呀???比如下面的程序,readUTF方法就可以知道讀取"昨天"這兩個字,是怎么知道我就剛好需要讀這兩個字,而不會把下面的內(nèi)容給讀出。很是感謝大家的回答
package com.zhang.hello;import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;public class IODataStreamTest { public static void main(String[] args) throws IOException {File file=new File("f:/zhang.dat"); if(!file.exists()){ file.createNewFile(); } DataInputStream dis=new DataInputStream(new FileInputStream(file)); DataOutputStream dos=new DataOutputStream(new FileOutputStream(file));int testInt=2016; double testDouble=10.12; long testLong=20161012;dos.writeInt(testInt); dos.writeDouble(testDouble); dos.writeLong(testLong); //utf-8 一個中文占3個字節(jié) dos.writeUTF("昨天"); dos.writeUTF("今天是個好日子"); dos.close();int testRInt=dis.readInt(); System.out.println(testRInt); double testRDouble=dis.readDouble(); System.out.println(testRDouble); long testRLong=dis.readLong(); System.out.println(testRLong); String testRStr=dis.readUTF();//為什么readUTF知道讀取多長 System.out.println(testRStr); dis.close(); } }
執(zhí)行結(jié)果:
2016
10.12
20161012
昨天
DataInputStream
看源碼,調(diào)用的第一句就獲取了長度int utflen = in.readUnsignedShort();
這個方法的Doc :
Reads two input bytes and returns an int value in the range 0 through
readUTF的Doc:
Let a be the first byte read and b be the second byte. The value returned is:
IOException - if an I/O error occurs.