内存操作流

之前的所有的流操作都是针对文件的,但是有时候只是想要实现数据间转换,此时如果我们想要创建一个文件然后再删除文件,那样显得有点麻烦,因此此时的内存操作流就显得很适合这类的操作,因为它只是在内存中存储,并不会真正的创建文件,内存操作流涉及的两个类是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()); //输出chenjiabing
outputStream.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()); //利用输出流输出转换后的字符串,即是去取出内存中的数据 } }

参考文章

Java IO学习笔记四的更多相关文章

  1. Java IO学习笔记四:Socket基础

    作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...

  2. Java IO学习笔记:概念与原理

    Java IO学习笔记:概念与原理   一.概念   Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...

  3. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  4. 零拷贝详解 Java NIO学习笔记四(零拷贝详解)

    转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...

  5. Java IO学习笔记七:多路复用从单线程到多线程

    作者:Grey 原文地址:Java IO学习笔记七:多路复用从单线程到多线程 在前面提到的多路复用的服务端代码中, 我们在处理读数据的同时,也处理了写事件: public void readHandl ...

  6. Java IO学习笔记总结

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

  7. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  8. Java IO学习笔记一

    Java IO学习笔记一 File File是文件和目录路径名的抽象表示形式,总的来说就是java创建删除文件目录的一个类库,但是作用不仅仅于此,详细见官方文档 构造函数 File(File pare ...

  9. Java IO学习笔记一:为什么带Buffer的比不带Buffer的快

    作者:Grey 原文地址:Java IO学习笔记一:为什么带Buffer的比不带Buffer的快 Java中为什么BufferedReader,BufferedWriter要比FileReader 和 ...

随机推荐

  1. IO和socket编程

    五一假期结束了,突然想到3周前去上班的路上看到槐花开的正好.放假也没能采些做槐花糕,到下周肯定就老了.一年就开一次的东西,比如牡丹,花期也就一周.而花开之时,玫瑰和月季无法与之相比.明日黄花蝶也愁.想 ...

  2. idea 查看tomcat源码

    一.源码下载 SVN :http://svn.apache.org/repos/asf/tomcat/ GIT :https://github.com/apache 二.添加pom.xml文件 1. ...

  3. [刷题]算法竞赛入门经典(第2版) 4-1/UVa1589 - Xiangqi

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1589 #include<iostream> #incl ...

  4. Linux(ubuntu)下jdk&tomcat的安装

    1.下载相应版本的jdk及tomcat:sudo wget ${url} 2.解压: tar zxvf jdk-7u79-linux-x64.tar.gz​ tar zxvf apache-tomca ...

  5. 如何使用RSYNC搭建备份服务器

    1. RSYNC介绍 RSYNC是一款开源的,快速的,多功能的,可实现全量及增量的本地或远程数据同步备份的优秀工具.Rsync软件适用于unix/linux/windows等多种操作系统平台. 远程数 ...

  6. (转)static 变量

    一. static 变量 static变量大致分为三种用法1. 用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期.2. 用于全局变量,主要作用是限制此全局变量被其他的文 ...

  7. C#单元测试,带你入门

    注:本文示例环境 VS2017 XUnit 2.2.0 单元测试框架 xunit.runner.visualstudio 2.2.0 测试运行工具 Moq 4.7.10 模拟框架 为什么要编写单元测试 ...

  8. nodeJS中的包

    前面的话 Node组织了自身的核心模块,也使得第三方文件模块可以有序地编写和使用.但是在第三方模块中,模块与模块之间仍然是散列在各地的,相互之间不能直接引用.而在模块之外,包和NPM则是将模块联系起来 ...

  9. chrome的断点调试

    DOM节点变化时触发断点具体触发条件可分3种情况:子节点有变化.节点的属性发生变化或这个节点被删除.可以快速找到对应的事件处理函数. 条件断点 写一个表达式,表达式为 true 时才触发该断点. 在D ...

  10. 将C-风格字符串用作string对象引用参数

    string类定义了一种char*到string的转换功能,这使得可以使用C-风格字符串来初始化string对象. 类型为const引用的形参其中一个属性表明:假设实参的参数类型与引用参数不匹配,但可 ...