欢迎光临散文网 会员登陆 & 注册

java数据字节流

2022-08-25 11:37 作者:虚云幻仙  | 我要投稿

/**
* 数据字节流DataInputStream/DataOutputStream
* 处理流,提供对java基础数据类型及String的存取方法,数据可以通过数据流直接存取,不需要手动转换类型
*/

public class DataStream1 {
   public static void main(String[] args) {
       try(DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("iostream/testData")))){
           //数据流为字节处理流,需要传入字节节点流,在节点流外套一层缓冲流提高效率
           dos.writeBoolean(true);
           //直接写入基础数据类型
           //.writeBoolean()方法将占1bit的boolean值前面增加7个0组成byte存储,true为00000001,false为00000000

           dos.writeByte(255);
           //.writeByte()方法会将byte直接写入,占1字节的255为11111111
           dos.writeChar('a');
           //.writeChar()方法会将char按2字节写入,a为97,存储为00000000 01100001
           dos.writeDouble(Math.random());
           //double占8字节,存储过程不占用额外空间,将double数值原样保存
           dos.writeLong(124L);
           //long占8字节
           dos.writeUTF("直接写入字符串使用.writeUTF方法");
           dos.flush();
       }catch (Exception e){
           e.printStackTrace();
       }

       //如果用记事本txt直接打开结果为: a???       | *鐩存帴鍐欏叆瀛楃涓蹭娇鐢?writeUTF鏂规硶
       //每种数据存储占用空间不相同,当要读取这些数据时需要使用DataInputStream按存储的顺序来读


       try(DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("iostream/testData")))){
           //读取必须按照存储的顺序调用读取方法
           boolean bo = dis.readBoolean();
           //将数据取出直接转换为存储时的数据类型
           //如果使用.read()会返回1,且指针同样会转到第二个字节

           byte by = dis.readByte();
           //.readByte()方法会调用.read(),返回255,如果直接使用.read()也会返回255,byte的读取为0-255,没有负数,如果对65535读取readShort()会返回-1
           char ch = dis.readChar();
           //如果使用.read()需要两次才能读完char,第一次结果为0,第二次为97,对应字符'a'占用两字节
           double dou = dis.readDouble();
           //double占8字节,执行8次read()才能将指针移至下一个数据
           long lo = dis.readLong();
           String st = dis.readUTF();
           System.out.println(bo+"\t"+by+"\t"+ch+"\t"+dou+"\t"+lo+"\t"+st);
           //结果为true  -1 a  0.9184927814592927 124    直接写入字符串使用.writeUTF方法
       }catch (Exception e){
           e.printStackTrace();
       }

       //dos.writeChars(".writeChars()方法会将传入的字符串分割成字符顺序存储,在.readChar()时需要一个一个的读取");
       //数据流写入基础数据类型会将数据按其二进制的值直接存储,不进行修改(除boolean扩容至8bit),而记事本之所以读取不正确是因为调用了字符集,按字符集的规则(gbk读2字节作为一个字符,UTF-8读3字节作为一个字节)进行解码
       //而基础数据类型是直接写入的,没有经过编码,byte的255就是11111111只占1个字节,char的'a'是00000000 01100001占了2个字节,所以无论何种字符集都无法正确读取内容

   }
}

java数据字节流的评论 (共 条)

分享到微博请遵守国家法律