zoukankan      html  css  js  c++  java
  • DataOutputStream、DataInputStream、ByteArrayOutputStream、ByteArrayInputStream简介

    ByteArrayOutputStream是向内存中写入流数据
    ByteArrayInputStream是从内存中如数据
    例如:
    ByteArrayInputStream arrayInputStream =new ByteArrayInputStream("连".getBytes());
    这就从内存中读取流数据;
    然后用read方法就可以读出数据了;
    同样的道理
    ByteArrayOutputStream arrayOutputStream =new ByteArrayOutputStream();
    arrayOutputStream.write(97);
    arrayOutputStream.write(98);
    byte[] bs =arrayOutputStream.toByteArray();
    可以像内存中写数据,通过arrayOutputStream.toByteArray();获取到写的数据

    然后引入了DataOutputStream、DataInputStream;
    他们的作用就是格式化。因为我们的流操作的都是byte字节。这种可读性很差的。
    而DataOutputStream、DataInputStream提供了很多读取数据的方法
    如in.readUTF()、in.readInt()。。。。
    下面是一个例子,把“连”写入到内存中

    ByteArrayOutputStream arrayOutputStream =new ByteArrayOutputStream();
    DataOutputStream out =new DataOutputStream(arrayOutputStream);
    out.writeUTF("连");

    byte[] bs =arrayOutputStream.toByteArray();
    然后我们通过数据取到的是
    0
    3
    -24
    -65
    -98
    后三位是"连"的utf-8编码。前两位我也不知道是什么,第二位好像是字节数,如果两个字的话就是6.(好像是)
    但是:
    ByteArrayInputStream arrayInputStream =new ByteArrayInputStream("连".getBytes());
    DataInputStream in =new DataInputStream(arrayInputStream);

    System.out.println(in.readUTF());
    就会出错。主要原因为我认为这样写  流的源里面没有 0 和3。于是我改进如下:
    byte[] bs1 ={0,3,-24,-65,-98};
    ByteArrayInputStream arrayInputStream =new ByteArrayInputStream(bs1);
    DataInputStream in =new DataInputStream(arrayInputStream);

    System.out.println(in.readUTF());
    完全就没有问题了。
    看来真是这个原因。

    还有一个问题就是:
    ByteArrayOutputStream arrayOutputStream =new ByteArrayOutputStream();
    DataOutputStream out =new DataOutputStream(arrayOutputStream);
    out.writeInt(1200);

    byte[] bs =arrayOutputStream.toByteArray();
    for(byte b:bs)
    {
    System.out.println(b);
    }
    打印结果是
    0
    0
    4
    -80
    这里打印出来的是16进制
    也就是4*(16^2)+(256-80)=1024+176=1200

  • 相关阅读:
    通过AOP引入Log4j
    Spring和Spring MVC框架进行单元测试
    JAVA异常基本知识及异常在Spring框架中的整体解决方案
    JAVA基础之重载,覆盖/重写,多态
    JAVA基础之内存
    JAVA基础之数组
    软件设计模式的原则
    ecstore 新增模块(页面)
    gitstack 密码重置
    thinkphp3.2整合workerman 多入口模式(windows)
  • 原文地址:https://www.cnblogs.com/qingblog/p/2550811.html
Copyright © 2011-2022 走看看