java數(shù)據(jù)字節(jié)流
/**
* 數(shù)據(jù)字節(jié)流DataInputStream/DataOutputStream
* 處理流,提供對(duì)java基礎(chǔ)數(shù)據(jù)類型及String的存取方法,數(shù)據(jù)可以通過(guò)數(shù)據(jù)流直接存取,不需要手動(dòng)轉(zhuǎn)換類型
*/
public class DataStream1 {
? ?public static void main(String[] args) {
? ? ? ?try(DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("iostream/testData")))){
? ? ? ? ? ?//數(shù)據(jù)流為字節(jié)處理流,需要傳入字節(jié)節(jié)點(diǎn)流,在節(jié)點(diǎn)流外套一層緩沖流提高效率
? ? ? ? ? ?dos.writeBoolean(true);
? ? ? ? ? ?//直接寫入基礎(chǔ)數(shù)據(jù)類型
? ? ? ? ? ?//.writeBoolean()方法將占1bit的boolean值前面增加7個(gè)0組成byte存儲(chǔ),true為00000001,false為00000000
? ? ? ? ? ?dos.writeByte(255);
? ? ? ? ? ?//.writeByte()方法會(huì)將byte直接寫入,占1字節(jié)的255為11111111
? ? ? ? ? ?dos.writeChar('a');
? ? ? ? ? ?//.writeChar()方法會(huì)將char按2字節(jié)寫入,a為97,存儲(chǔ)為00000000 01100001
? ? ? ? ? ?dos.writeDouble(Math.random());
? ? ? ? ? ?//double占8字節(jié),存儲(chǔ)過(guò)程不占用額外空間,將double數(shù)值原樣保存
? ? ? ? ? ?dos.writeLong(124L);
? ? ? ? ? ?//long占8字節(jié)
? ? ? ? ? ?dos.writeUTF("直接寫入字符串使用.writeUTF方法");
? ? ? ? ? ?dos.flush();
? ? ? ?}catch (Exception e){
? ? ? ? ? ?e.printStackTrace();
? ? ? ?}
? ? ? ?//如果用記事本txt直接打開(kāi)結(jié)果為: a??? ? ? ? | *鐩存帴鍐欏叆瀛楃涓蹭嬌鐢?writeUTF鏂規(guī)硶
? ? ? ?//每種數(shù)據(jù)存儲(chǔ)占用空間不相同,當(dāng)要讀取這些數(shù)據(jù)時(shí)需要使用DataInputStream按存儲(chǔ)的順序來(lái)讀
? ? ? ?try(DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("iostream/testData")))){
? ? ? ? ? ?//讀取必須按照存儲(chǔ)的順序調(diào)用讀取方法
? ? ? ? ? ?boolean bo = dis.readBoolean();
? ? ? ? ? ?//將數(shù)據(jù)取出直接轉(zhuǎn)換為存儲(chǔ)時(shí)的數(shù)據(jù)類型
? ? ? ? ? ?//如果使用.read()會(huì)返回1,且指針同樣會(huì)轉(zhuǎn)到第二個(gè)字節(jié)
? ? ? ? ? ?byte by = dis.readByte();
? ? ? ? ? ?//.readByte()方法會(huì)調(diào)用.read(),返回255,如果直接使用.read()也會(huì)返回255,byte的讀取為0-255,沒(méi)有負(fù)數(shù),如果對(duì)65535讀取readShort()會(huì)返回-1
? ? ? ? ? ?char ch = dis.readChar();
? ? ? ? ? ?//如果使用.read()需要兩次才能讀完char,第一次結(jié)果為0,第二次為97,對(duì)應(yīng)字符'a'占用兩字節(jié)
? ? ? ? ? ?double dou = dis.readDouble();
? ? ? ? ? ?//double占8字節(jié),執(zhí)行8次read()才能將指針移至下一個(gè)數(shù)據(jù)
? ? ? ? ? ?long lo = dis.readLong();
? ? ? ? ? ?String st = dis.readUTF();
? ? ? ? ? ?System.out.println(bo+"\t"+by+"\t"+ch+"\t"+dou+"\t"+lo+"\t"+st);
? ? ? ? ? ?//結(jié)果為true ?-1 a ?0.9184927814592927 124 ? ?直接寫入字符串使用.writeUTF方法
? ? ? ?}catch (Exception e){
? ? ? ? ? ?e.printStackTrace();
? ? ? ?}
? ? ? ?//dos.writeChars(".writeChars()方法會(huì)將傳入的字符串分割成字符順序存儲(chǔ),在.readChar()時(shí)需要一個(gè)一個(gè)的讀取");
? ? ? ?//數(shù)據(jù)流寫入基礎(chǔ)數(shù)據(jù)類型會(huì)將數(shù)據(jù)按其二進(jìn)制的值直接存儲(chǔ),不進(jìn)行修改(除boolean擴(kuò)容至8bit),而記事本之所以讀取不正確是因?yàn)檎{(diào)用了字符集,按字符集的規(guī)則(gbk讀2字節(jié)作為一個(gè)字符,UTF-8讀3字節(jié)作為一個(gè)字節(jié))進(jìn)行解碼
? ? ? ?//而基礎(chǔ)數(shù)據(jù)類型是直接寫入的,沒(méi)有經(jīng)過(guò)編碼,byte的255就是11111111只占1個(gè)字節(jié),char的'a'是00000000 01100001占了2個(gè)字節(jié),所以無(wú)論何種字符集都無(wú)法正確讀取內(nèi)容
? ?}
}