`
wwty
  • 浏览: 537071 次
  • 性别: Icon_minigender_1
  • 来自: 北京-郑州
社区版块
存档分类
最新评论

ByteArrayInputStream和ByteArrayOutputStream

 
阅读更多

ByteArrayInputStream的精髓是将一个字节数组包装到流中
有这样一个场景:
客户端和服务器端交互,当连接建立之后,如果只是根据协议用DataInputStream的readInt() 或者readByte() 等固定方法一个一个的读,那是相当消耗资源的,如果一次将所需要的数据读取完毕,然后剩下的就是本地解析,那就省了不少交互资源

 

int packetlen = din.readInt();
int len = packetlen-4;
byte[] b = new byte[len];
din.readFully(b);

 

这段代码一次读够了客户端过来的数据

然后

ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(b);
DataInputStream dataInputStream = new DataInputStream(byteArrayInputStream);
//此时的输入流已经是本地的输入流了,在本地你可以随心所欲
dataInputStream.readByte() 
dataInputStream.readInt() 
.....

 

 

ByteArrayOutputStream创建一个新的字节数组输出流
场景如下:服务器端处理完毕需要往客户端返回数据,如果使用DataOutputStream的writeInt(int v)或者writeByte(int v)等方法一个一个的写,那么和读取的场景性质就一样了:交互资源是相当消耗的;因此如果现在本地把数据组织完毕之后,能一次传送,就好了。

声明字节数组输出流

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(29);

 

对字节数组输出流进行包装,这样写入的时候,数据真正进入的还是ByteArrayOutputStream

DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream);

 

往流当中写入数据

dataOutputStream.writeInt(29);//packetlen
dataOutputStream.writeInt(JVConstant.SGIP_BIND_RESP);//command
dataOutputStream.write(sequence);//sequence-number
dataOutputStream.writeByte(0);//Result
byte[] reserve = new byte[8];
dataOutputStream.write(reserve);//Reserve
dataOutputStream.flush();

 

从字节数组输出流当中将数据读取出来

byte[] result = byteArrayOutputStream.toByteArray();

 

关闭流

byteArrayOutputStream.close();
dataOutputStream.close();

 

返回字节数据

return result;

 

分享到:
评论

相关推荐

    【IT十八掌徐培成】Java基础第16天-04.ByteArrayInputStream-ByteArrayOutputStream.zip

    【IT十八掌徐培成】Java基础第16天-04.ByteArrayInputStream-ByteArrayOutputStream.zip

    详解Java中ByteArray字节数组的输入输出流的用法

    ByteArrayInputStream和ByteArrayOutputStream分别集成自InputStream和OutputStream这两个输入和输出流,这里我们就来详解Java中ByteArray字节数组的输入输出流的用法,需要的朋友可以参考下

    Java使用ByteArrayOutputStream 和 ByteArrayInputStream 避免重复读取配置文件的方法

    主要介绍了Java使用ByteArrayOutputStream 和 ByteArrayInputStream 避免重复读取配置文件的方法,需要的朋友可以参考下

    ByteArrayInOutStream:一个Java类,允许从ByteArrayOutputStream到ByteArrayInputStream的快速,简单的“转换”

    ByteArrayInOutStream 一个Java类,允许从ByteArrayOutputStream到ByteArrayInputStream的快速,简单的“转换”主页 ## License此源代码(ByteArrayInOutStream.java)是免费许可证。 这意味着您可以随意使用它,而...

    java ZIP 解压缩

    ByteArrayInputStream bais = new ByteArrayInputStream(data); ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 压缩 compress(bais, baos); byte[] output = baos.toByteArray(); ...

    IO流各个类的使用方法

    介绍了,下面这些类的具体使用...ByteArrayInputStream ByteArrayOutputStream 【字符流】 Reader Writer InputStreamReader OutputStreamWriter BufferedReader BufferedWriter /PrintWriter FileReader FileWriter

    PhoneBooks

    ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF(userName); dos.writeUTF(mobilePhone); dos.writeUTF(email); dos.writeUTF...

    BSONforJackson.zip

     ByteArrayOutputStream baos = new ByteArrayOutputStream();  ObjectMapper mapper = new ObjectMapper(new BsonFactory());  mapper.writeValue(baos, bob);  //deserialize data  ...

    Message.java

    JAVA使用ByteArrayOutputStream、ByteArrayInputStream将对象序列化反序列化,通过JAVA socket实现对象在网络中传输

    TcpServer.java

    JAVA使用ByteArrayOutputStream、ByteArrayInputStream将对象序列化反序列化,通过JAVA socket实现对象在网络中传输

    TcpClient.java

    JAVA使用ByteArrayOutputStream、ByteArrayInputStream将对象序列化反序列化,通过JAVA socket实现对象在网络中传输

    java72-java-advance.rar

    3. ByteArrayOutputStream将下列哪一项作为输出流 C a) 字符b)字节c)字节数组D)对象 4. 下列流中哪一个使用了缓冲区技术A A.BuffereOutputStream B. FileInputStream C. DataOutputStream D.FileReader 5....

    深刻理解java io

    1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用 2) StringBufferInputStream:把一个String对象作为InputStream 3) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作 4) ...

    Java程序设计语言期末试题

    1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中 2) FileOutputStream:把信息存入文件中 3) PipedOutputStream:实现了pipe的概念,主要在线程中使用 4) SequenceOutputStream:把多个OutStream合并为一...

    教你彻底明白Java的IO系统

    在Java的IO中,所有的stream(包括Input和Out stream)都包括两种类型: 1.1 以字节为导向的stream 以字节为导向的stream,表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种...

    验证码生成工具

    corejava 实现验证码随机生成 public static InputStream change(BufferedImage image) throws Exception{ //将image图片压缩成JPEG ByteArrayOutputStream bos =... return new ByteArrayInputStream(bytes); }

    Java-IO-Learning

    Java IO学习 FileInputStream,FileOutputstream 随机存取文件 ByteArrayOutputStream,ByteArrayInputStream

    JDK_API_1_6

    ByteArrayInputStream ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。 ByteArrayOutputStream 此类实现了一个输出流,其中的数据被写入一个 byte 数组。 CharArrayReader 此类实现一个...

    IO体系.java

    InputStream ... |--ByteArrayOutputStream/:实现了一个输出流,其中的数据写入到一个byte数组。 | 使用toByteArray()和toString()获取数据。关闭无效,依然可以调用。不会产生任何IOException异常。

    Android实现压缩字符串的方法示例

    前言 Android端可以对字符串...import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutput

Global site tag (gtag.js) - Google Analytics