public void write(byte[] b,
int off,
int len)
public void write(int b)
这是ByteArrayOutputStream的一个单参数方法
我不太明白,既然是要写入的是一个字节,为什么不是public void write(byte b),因为int是4个字节,相当于是长度为4的byte[].而且据我了解,只有套了DataOutputStream以后才能些入long,int型的数据.
JDK说明:
将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。
其实就是写入一个byte。OutputStream的方法,还有InputStream的read返回也是int,Java就这么设计的,好像是处于一个编程习惯,实际上就是一个byte。
public class ByteArrayOutputStream
extends OutputStream
此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。
关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
public void write(int b)
将指定的字节写入此 byte 数组输出流。
public void write(byte[] b,
int off,
int len)
将指定 byte 数组(b)中从偏移量 off 开始的 len 个字节写入此 byte 数组输出流。
ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据。在网络传输中我们往往要传输很多变量,我们可以利用ByteArrayOutputStream把所有的变量收集到一起,然后一次性把数据发送出去。具体用法如下:
ByteArrayOutputStream:
ByteArrayInputStream: 可以将字节数组转化为输入流
- public class Test {
- public static void main(String[] args) {
- int a = 0;
- int b = -3;
- int c = 2;
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- bos.write(a);
- bos.write(b);
- bos.write(c);
- byte[] buf = bos.toByteArray();
- for(int i=0; i<buf.length; i++){
- System.out.println(buf[i]);
- }
- System.out.println("*******************");
- ByteArrayInputStream bis = new ByteArrayInputStream(buf);
- //public int read()从此输入流中读取下一个数据字节。返回一个 0 到 255 范围内的 int 字节值。
- //如果因为到达流末尾而没有可用的字节,则返回值 -1。
- //此 read 方法不会阻塞。 b=-3,因为read 返回的是一个0-255范围内的数据,这里返回253
- while((b = bis.read())!= -1){
- System.out.println(b);
- }
- }
- }
public int read()
从此输入流中读取下一个数据字节。返回一个 0 到 255 范围内的 int 字节值。如果因为到达流末尾而没有可用的字节,则返回值 -1。
此 read 方法不会阻塞。
public void write(int b)
将指定的字节写入此 byte 数组输出流。
ByteArrayInputStream 读取的是下一个字节数据。返回的是一个0-255 范围内的int字节值。写的也是一个字节,虽然参数是int,但是一个int占4个字节,写的是低八位。如果想写或读 整数,浮点数,数组 可以借助DataOutputStream(数据输出流/数据输入流)完成!!
- public class Test {
- public static void main(String[] args) throws IOException {
- int a = -1;
- float b = -3f;
- String str = "hello";
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- DataOutputStream dos = new DataOutputStream(bos);
- dos.writeInt(a);
- dos.writeFloat(b);
- dos.writeUTF(str);
- //a,b,str在字节数组中的保存数据为:
- // [-1, -1, -1, -1, -64, 64, 0, 0, 0, 5, 104, 101, 108, 108, 111]
- byte[] buf = bos.toByteArray();
- for(int i=0; i<buf.length; i++){
- System.out.println(buf[i]);
- }
- System.out.println("*******************");
- ByteArrayInputStream bis = new ByteArrayInputStream(buf);
- //public int read()从此输入流中读取下一个数据字节。返回一个 0 到 255 范围内的 int 字节值。
- //如果因为到达流末尾而没有可用的字节,则返回值 -1。
- //此 read 方法不会阻塞。 b=-3,因为read 返回的是一个0-255范围内的数据,这里返回253
- //255.0,255.0,255.0,255.0,192.0,64.0,0.0,0.0,0.0,5.0,104.0,101.0,108.0,108.0,111.0,
- while((b = bis.read())!= -1){
- System.out.print(b+",");
- }
- }
- }
为了正确读取数据用 DataInputStream 完成:
- public class Test {
- public static void main(String[] args) throws IOException {
- int a = -1;
- float b = -3f;
- String str = "hello";
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- DataOutputStream dos = new DataOutputStream(bos);
- dos.writeInt(a);
- dos.writeFloat(b);
- dos.writeUTF(str);
- //a,b,str在字节数组中的保存数据为:
- // [-1, -1, -1, -1, -64, 64, 0, 0, 0, 5, 104, 101, 108, 108, 111]
- byte[] buf = bos.toByteArray();
- for(int i=0; i<buf.length; i++){
- System.out.println(buf[i]);
- }
- System.out.println("*******************");
- ByteArrayInputStream bis = new ByteArrayInputStream(buf);
- DataInputStream dis = new DataInputStream(bis);
- System.out.println(dis.readInt());
- System.out.println(dis.readFloat());
- System.out.println(dis.readUTF());
- }
- }