Java之数据流DataInput(Output)Stream 和 字节数组流 ByteArrayInput(Output) Stream的嵌套
2016-09-16 10:41
441 查看
学到网络编程这一章,马老师提出了一个问题:怎样使用Java传输一个long类型的数?
额,能力有限,所以看了答案后解析下,加深印象。
发送端(TestUDPClient)方法如下:
可以看到实际上java并没有提供1个封装好的方法,致使是long这个基本类型的封装类Long, 也没有提供转换为ByteArray的方法.。
但是Java提供两个流, 它们嵌套使用的话, 就相当于实现了上面所说的功能, 将各种基本类型转换为字节数组。
它们就是DataOutputStream 和 ByteArrayOutputStream。
long n = 10000L;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeLong(n);
在这一段中,可以看到一个long类型的数通过数据流传输了出去。
那么接收端怎样接收呢:
在这一段中,可以看到数据通过数据流传输了进来。
再运用DataOutputStream 和 ByteArrayOutputStream嵌套使用后:
ds.receive(dp);
ByteArrayInputStream bais = new ByteArrayInputStream(buf);
DataInputStream dis = new DataInputStream(bais);
System.out.println(dis.readLong());
很轻松的就拿到了long类型数据。
实在是厉害,零散的知识就这样结合并运用了。
不过我在想可不可以用这个方法传输任意一个object对象呢,我再试试。
额,能力有限,所以看了答案后解析下,加深印象。
发送端(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对象呢,我再试试。
相关文章推荐
- 数据流DataInput(Output)Stream 和 字节数组流 ByteArrayInput(Output) Stream
- Java基础---Java---IO流-----对象的序列化、管道流、RandomAccessFile、数据类型的流对象DataStream、ByteArrayStream
- java流与文件——读写二进制数据(DataOutput + DataInput)
- Java基础---Java---IO流-----对象的序列化、管道流、RandomAccessFile、数据类型的流对象DataStream、ByteArrayStream
- Lesson_for_java_day18--java中的IO流(序列化、ByteArrayStream、DataStream、RandowAccessFile)
- JAVA基础学习(二十二)--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码
- 将BitmapData数据转换为ByteArray, 保存ByteArray
- Java基础 管道流 RandomAccessFile DataStream ByteArrayStream 字符编码
- java IO 操作字节数组 ByteArrayStream
- Java IO 节点流 ByteArrayInput/OutputStream
- JAVA基础学习day22--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码
- java IO笔记(DataInput/DataOutput)
- java hex binary data to byte array
- (93)DataStream(操作基本数据类型)、ByteArrayStream(操作字节数组)
- Flex 与 Java 上传ByteArray图片数据
- Lengths of Primitive Java and C++ Data Types on Linux and Windows 32-bit/64-bit (Linux和Windows上Java和C++基本数据类型的长度对比32位/64位)
- JAVA高级视频02_IO输入与输出 06 ByteArrayInputStram和ByteArrayOutputStream 学习笔记
- JAVA中有关byte,int,long这些基本数据类型的存储方式以及负数在JAVA中的表示方式
- JAVA IO系列----ByteArrayInputStream和ByteArrayOutputStream类
- Java解析DBF文件,错误Failed to parse Number: For input string: "-.---" 或读取不出数据或乱码问题都在这里解决