Java之数据流DataInput(Output)Stream 和 字节数组流 ByteArrayInput(Output) Stream的嵌套

来源:互联网 发布:java 自定义函数 编辑:程序博客网 时间:2024/05/16 15:12

学到网络编程这一章,马老师提出了一个问题:怎样使用Java传输一个long类型的数?

额,能力有限,所以看了答案后解析下,加深印象。

发送端(TestUDPClient)方法如下:

import java.net.*;import java.io.*;public class TestUDPClient{public static void main(String args[]) throws Exception{long n = 10000L;ByteArrayOutputStream baos = new ByteArrayOutputStream();DataOutputStream dos = new DataOutputStream(baos);dos.writeLong(n);byte[] buf = baos.toByteArray();System.out.println(buf.length);DatagramPacket dp = new DatagramPacket(buf, buf.length,new InetSocketAddress("127.0.0.1", 5678));DatagramSocket ds = new DatagramSocket(9999);ds.send(dp);ds.close();}}



可以看到实际上java并没有提供1个封装好的方法,致使是long这个基本类型的封装类Long, 也没有提供转换为ByteArray的方法.。

但是Java提供两个流, 它们嵌套使用的话, 就相当于实现了上面所说的功能, 将各种基本类型转换为字节数组。

它们就是DataOutputStream 和 ByteArrayOutputStream。

long n = 10000L;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeLong(n);

在这一段中,可以看到一个long类型的数通过数据流传输了出去。

那么接收端怎样接收呢:

import java.net.*;import java.io.*;public class TestUDPServer{public static void main(String args[]) throws Exception{byte buf[] = new byte[1024];DatagramPacket dp = new DatagramPacket(buf, buf.length);DatagramSocket ds = new DatagramSocket(5678);while(true){ds.receive(dp);ByteArrayInputStream bais = new ByteArrayInputStream(buf);DataInputStream dis = new DataInputStream(bais);System.out.println(dis.readLong());}}}


在这一段中,可以看到数据通过数据流传输了进来。

再运用DataOutputStream 和 ByteArrayOutputStream嵌套使用后:

ds.receive(dp);
ByteArrayInputStream bais = new ByteArrayInputStream(buf);
DataInputStream dis = new DataInputStream(bais);
System.out.println(dis.readLong());

很轻松的就拿到了long类型数据。

实在是厉害,零散的知识就这样结合并运用了。

不过我在想可不可以用这个方法传输任意一个object对象呢,我再试试。


0 0