内存操作流

之前的所有的流操作都是针对文件的,但是有时候只是想要实现数据间转换,此时如果我们想要创建一个文件然后再删除文件,那样显得有点麻烦,因此此时的内存操作流就显得很适合这类的操作,因为它只是在内存中存储,并不会真正的创建文件,内存操作流涉及的两个类是ByteArrayInputStream,ByteArrayOutputStream.

ByteArrayInputStream

  • ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。

  • 关闭 ByteArrayInputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException

  • 主要的功能是从缓冲区读取字节

构造函数

  • ByteArrayInputStream(byte[] buf) 创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组。

  • ByteArrayInputStream(byte[] buf, int offset, int length) 创建 ByteArrayInputStream,使用 buf 作为其缓冲区数组。

常用的方法

  • close() 不过对这个无效,因为关闭之后仍然可以使用函数读取而不报错

  • int read() 从缓冲区中读取一个字节

  • int read(byte[] bytes) 将缓冲区中的内容读取到数组中

  • int read(byte[] bytes,int off,int len) 将最多 len 个数据字节从此输入流读入 byte 数组。

  • long skip(long n) 从此输入流中跳过 n 个输入字节。

  • void reset() 将此 byte 数组输出流的 count 字段重置为零,从而丢弃输出流中目前已累积的所有输出(清除缓冲区)

实例

public class demo8 {public static void main(String args[]) {String str = "chenjiabing\n陈加兵";byte[] bytes = str.getBytes();  //创建一个数组ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);  //使用bytes作为缓冲区数组int temp = 0;/*第一种方法读取缓冲区中的数据,这个和文件的操作不一样,这个可以直接冲缓冲区中读取数据字节*/while ((temp = inputStream.read()) != -1) {System.out.print((char) temp);}/*创建数组用于存储读取的内容,下面是第二种读取数据的方法*/byte[] b = new byte[bytes.length];try {int len = inputStream.read(b);} catch (IOException e) {e.printStackTrace();}System.out.println(new String(b));}}

ByteArrayOutputStream

  • 此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。

  • 关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException

构造函数

  • ByteArrayOutputStream() 创建一个新的 byte 数组输出流。

  • ByteArrayOutputStream(int size) 创建一个新的 byte 数组输出流,它具有指定大小的缓冲区容量(以字节为单位)。

常用函数

  • int size() 返回缓冲区的当前大小。

  • byte[] toByteArray() 创建一个新分配的 byte 数组。

  • String toString() 将缓冲区的字节转换成字符串

  • void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此 byte 数组输出流。

  • void write(int b) 将指定的字节写入此 byte 数组输出流。

实例

public class demo8 {public static void main(String args[]) {ByteArrayOutputStream outputStream = new ByteArrayOutputStream();String str = "chenjiabing";try {outputStream.write(str.getBytes());   //将字符串转换成数组然后写入缓冲区} catch (IOException e) {e.printStackTrace();} finally {try {outputStream.close();  //这里的关闭无效} catch (IOException e) {e.printStackTrace();}}//将缓冲区的数据转换成字符串后输出,这里同样可以看出输出流的关闭根本不影响函数的调用System.out.println(outputStream.size());  //输出缓冲区的大小System.out.println(outputStream.toString());  //输出chenjiabingoutputStream.reset();   //清除缓冲区的内容,如果不清零那么原先写入的数据还是存在的,但是此时我们已经不需要前面的数据了try {outputStream.write("陈加兵".getBytes());  //继续向缓冲区写入数据} catch (IOException e) {e.printStackTrace();}System.out.println(outputStream.size());  //这里的一个汉字占了三个字节System.out.println(outputStream.toString());//输出陈加兵}}

综合

下面我们结合上面的两个类将字符串转换大小写

public class demo8 {public static void main(String args[]) {ByteArrayOutputStream outputStream = new ByteArrayOutputStream();String str = "chenjiabing";ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes());  //实例化输入流int temp = 0;while ((temp = inputStream.read()) != -1)   //读取缓冲区的字节数据{char c = (char) temp;  //将整数转换成字符,ascii码的转换outputStream.write(Character.toUpperCase(c));  //转换成大写,然后写入输出流的缓冲区中}System.out.println(outputStream.toString());   //利用输出流输出转换后的字符串,即是去取出内存中的数据}}

参考文章

  • http://blog.csdn.net/yyyandro...

  • http://www.cnblogs.com/lich/a...

Java IO学习笔记四相关推荐

  1. Java IO学习笔记总结

    Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 InputStreamReader和OutputStreamW ...

  2. Java IO学习笔记(四)打印流

    1.只有输出流才有打印流:PrintWriter和PrintStream分别针对字符和字节,提供了重载的print,Println方法用于多种数据类型的输出.PrintWriter和PrintStre ...

  3. Java IO ---学习笔记(数据流)

    数据流: 接口 DataInput 和 DataOutput,设计了一种较为高级的数据输入输出方式:除了可处理字节和字节数组外,还可以处理 int.float.boolean等基本数据类型,这些数据在 ...

  4. 【Java基础学习笔记】- Day11 - 第四章 引用类型用法总结

    Java基础学习笔记 - Day11 - 第四章 引用类型用法总结 Java基础学习笔记 - Day11 - 第四章 引用类型用法总结 4.1 class作为成员变量 4.2 interface作为成 ...

  5. Java NIO 学习笔记(三)----Selector

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  6. java多线程学习笔记。

    java多线程学习笔记 线程的优缺点: 多线程的好处: 充分利用多处理核心,提高资源的利用率和吞吐量. 提高接口的响应效率,异步系统工作. 线程的风险: 安全危险(竞争条件):什么坏事都没有发生.在没 ...

  7. 尚学堂JAVA基础学习笔记_2/2

    尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...

  8. Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  9. 【Java】学习笔记2——从小白到入门(技术提升篇)

    写在前面 [Java]学习笔记1--从小小白到小白 (基础知识篇)里记录了Java中最最基础的知识,在对基础知识有了基本了解之后,就可以开始着手技术提升了.本篇博客也将延续第一篇,继续记录我的Java ...

最新文章

  1. appJSON[tabBar][0][pagePath] pages/basics/basics 需在 pages 数组中
  2. 程序员弃码投中医?还做成了不错的生意! | 极客视频
  3. python 安卓模拟点击_python模拟点击在ios中实现的实例讲解
  4. halcon学习笔记——(1)单摄像机标定
  5. 安天移动安全发布“大脏牛”漏洞分析报告(CVE-2017-1000405)
  6. 函数作用域,匿名函数
  7. 实例42:python
  8. 嵌入式Linux系统的构成和启动总结
  9. [蛋蛋四格漫画]蛋蛋式按摩……(中日台词对照)
  10. 自动放大_放大招!滴滴自动驾驶汽车通过图灵测试,quot;车技quot;不输老司机...
  11. 项目遇到OpenSessionInViewFilter的默认sessionFactoryBeanName的问题
  12. 使用ffmpeg对视频、音频进行分离
  13. 深信服虚拟桌面部署及性能优化关键点配置(图文顺序全解)
  14. android 5.1 httpclient,【Android进阶学习】Http编程之HttpClient
  15. 计算机无法添加用户名或密码错误,win10系统无法登录网络打印机提示未知的用户名或者密码错误的设置技巧...
  16. 2019 ICPC西安邀请赛 游记
  17. Word大括号多行公式左对齐
  18. 对视图有时为什么使用select top 100 percent 而不使用 select 呢
  19. Impala graceful shutdown功能介绍
  20. 艾司博讯:拼多多推广投放时间设置步骤

热门文章

  1. nodejs学习资料
  2. golang atomic 32位机器问题
  3. Microsoft Lync Server 2013 协议路由
  4. 面试收集--卡特兰数(Catalan数)应用
  5. VS2008连接CodePlex的源代码管理服务
  6. 艾伟_转载:.NET 4.0中数组的新增功能
  7. Mars 算法实践——人脸识别
  8. 在衡量MPLS性能时需要注意什么
  9. vue经验(从别的文章里拼凑来的,不希望有人看,防止侵权)
  10. QT:KeepAliveOption的应用