内存流存在的意义:
当我们不需要持久化存储数据,而仅仅是需要进行数据中转的时候,就可以使用内存流。
内存流的使用场景:
1.代码中需要交换的数据,读写的数据,仅仅是代码之间需要交换,就没必要
内存 ==》 磁盘 磁盘 ==》内存 【可以在内存读写上提高了效率】
2.好处:提高了读写的效率,即数据处理的效率 。
内存流的具体实现类:
ByteArrayInputStream :
ByteArrayInputStream extends InputStream
,包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。
*ByteArrayOutputStream :
ByteArrayOutputStream extends OutputStream
, 此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。
CharArrayReader:
CharArrayReader extends Reader
,此类实现一个可用作字符输入流的字符缓冲区。
CharArrayWriter:
CharArrayWriter extends Writer
,此类实现一个可用作 Writer 的字符缓冲区。缓冲区会随向流中写入数据而自动增长。可使用 toCharArray() 和 toString() 获取数据。
测试代码:
StrRes.java
package com.icerno.cloud.model;
/**
*
* Copyright: Copyright (c) 2018 Jun_Zhou
*
* @ClassName: StrRes.java
* @Description: 字符串数据源;
*
* @version: v1.0.0
* @author: JunZhou
* @Email: 1769676159@qq.com
* @Site: CERNO
* @date: 2018年12月28日 上午11:30:54
*/
public class StrRes
{
public static String resStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" +
"<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\r\n" +
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n" +
" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n" +
" <modelVersion>4.0.0</modelVersion>\r\n" +
" <parent>\r\n" +
" <groupId>org.springframework.boot</groupId>\r\n" +
" <artifactId>spring-boot-starter-parent</artifactId>\r\n" +
" <version>2.1.1.RELEASE</version>\r\n" +
" <relativePath /> <!-- lookup parent from repository -->\r\n" +
" </parent>\r\n" +
" <groupId>com.icerno</groupId>\r\n" +
" <artifactId>SpringCloudUtils</artifactId>\r\n" +
" <version>0.0.1-SNAPSHOT</version>\r\n" +
" <name>SpringCloudUtils</name>\r\n" +
" <description>Utils for Spring Cloud</description>\r\n" +
"\r\n" +
" <properties>\r\n" +
" <java.version>1.8</java.version>\r\n" +
" </properties>\r\n" +
"\r\n" +
" <dependencies>\r\n" +
" <dependency>\r\n" +
" <groupId>org.springframework.boot</groupId>\r\n" +
" <artifactId>spring-boot-starter-web</artifactId>\r\n" +
" </dependency>\r\n" +
"\r\n" +
" <dependency>\r\n" +
" <groupId>org.springframework.boot</groupId>\r\n" +
" <artifactId>spring-boot-starter-test</artifactId>\r\n" +
" <scope>test</scope>\r\n" +
" </dependency>\r\n" +
"\r\n" +
" <!-- jgit相关的依赖 -->\r\n" +
" <dependency>\r\n" +
" <groupId>org.eclipse.jgit</groupId>\r\n" +
" <artifactId>org.eclipse.jgit</artifactId>\r\n" +
" <version>4.8.0.201706111038-r</version><!--$NO-MVN-MAN-VER$ -->\r\n" +
" </dependency>\r\n" +
" <!-- gitLab4j相关的依赖 -->\r\n" +
" <dependency>\r\n" +
" <groupId>org.gitlab4j</groupId>\r\n" +
" <artifactId>gitlab4j-api</artifactId>\r\n" +
" <version>4.8.7</version>\r\n" +
" </dependency>\r\n" +
" <!-- HuTool相关的依赖 -->\r\n" +
" <dependency>\r\n" +
" <groupId>cn.hutool</groupId>\r\n" +
" <artifactId>hutool-all</artifactId>\r\n" +
" <version>4.1.19</version>\r\n" +
" </dependency>\r\n" +
" <!-- Json-Web——Token相关的依赖 -->\r\n" +
" <dependency>\r\n" +
" <groupId>io.jsonwebtoken</groupId>\r\n" +
" <artifactId>jjwt</artifactId>\r\n" +
" <version>0.7.0</version>\r\n" +
" </dependency>\r\n" +
" <!-- 文本比较的工具类 -->\r\n" +
" <dependency>\r\n" +
" <groupId>com.googlecode.java-diff-utils</groupId>\r\n" +
" <artifactId>diffutils</artifactId>\r\n" +
" <version>1.2.1</version>\r\n" +
" </dependency>\r\n" +
" <!-- https://mvnrepository.com/artifact/org.apache.directory.studio/org.apache.commons.io -->\r\n" +
" <dependency>\r\n" +
" <groupId>org.apache.directory.studio</groupId>\r\n" +
" <artifactId>org.apache.commons.io</artifactId>\r\n" +
" <version>2.4</version>\r\n" +
" </dependency>\r\n" +
" <!-- \r\n" +
" <dependency>\r\n" +
" <groupId>com.googlecode.java-diff-utils</groupId>\r\n" +
" <artifactId>diffutils</artifactId>\r\n" +
" <version>1.3.0</version>\r\n" +
" </dependency> -->\r\n" +
" <!-- 工具类 -->\r\n" +
" <dependency>\r\n" +
" <groupId>lz.cloud</groupId>\r\n" +
" <artifactId>lz-common-tools</artifactId>\r\n" +
" <version>1.0.0</version>\r\n" +
" <exclusions>\r\n" +
" <exclusion>\r\n" +
" <groupId>QRCode</groupId>\r\n" +
" <artifactId>QRCode</artifactId>\r\n" +
" </exclusion>\r\n" +
" <exclusion>\r\n" +
" <groupId>javax.mail</groupId>\r\n" +
" <artifactId>mail</artifactId>\r\n" +
" </exclusion>\r\n" +
" <exclusion>\r\n" +
" <groupId>org.apache.poi</groupId>\r\n" +
" <artifactId>poi</artifactId>\r\n" +
" </exclusion>\r\n" +
" <exclusion>\r\n" +
" <groupId>org.apache.poi</groupId>\r\n" +
" <artifactId>poi-ooxml</artifactId>\r\n" +
" </exclusion>\r\n" +
" </exclusions>\r\n" +
" </dependency>\r\n" +
" </dependencies>\r\n" +
"\r\n" +
" <build>\r\n" +
" <plugins>\r\n" +
" <plugin>\r\n" +
" <groupId>org.springframework.boot</groupId>\r\n" +
" <artifactId>spring-boot-maven-plugin</artifactId>\r\n" +
" </plugin>\r\n" +
" </plugins>\r\n" +
" </build>\r\n" +
"\r\n" +
"</project>\r\n" +
"";
}
MemoryStreamDemo.java
package com.icerno.cloud.test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.CharArrayReader;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.LineNumberReader;
import com.icerno.cloud.model.StrRes;
/**
Copyright: Copyright (c) 2018 Jun_Zhou
@ClassName: MemoryStreamDemo.java
@Description: 该类的功能描述
@version: v1.0.0
@author: JunZhou
@Email: 1769676159@qq.com
@Site: CERNO
@date: 2018年12月29日 下午8:53:20
*/
public class MemoryStreamDemo
{
public static void main(String[] args) throws IOException
{
//内存字节流=====================================================================
ByteArrayOutputStream baos = new ByteArrayOutputStream();//不需要路径,写入内存,跟磁盘无需关联
baos.write("这是要写入内存流的数据".getBytes());//将字符串变成字节数组,写入内存
baos.close();//此处关闭内存流无效 下面的数据也可写入
baos.write("helloworld".getBytes());//注意:之前的IO流都是跟磁盘文件建立了连接,需要关闭连接即关闭流! 而关闭内存流跟连接无关
byte[] byteArray = baos.toByteArray();//获取内存中存数据的数组
//使用内存输入流 读取获得内存中的保存数据的数组
ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);//ByteArrayInputStream(byte[] buf):创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组。
//读
int len;
byte[] b = new byte[1024];
while ((len = bais.read(b)) != -1)
{
System.out.println(new String(b, 0, len));
}
//内存字符流============================================================================
CharArrayWriter caw = new CharArrayWriter();
caw.write(StrRes.resStr);
char[] ch = caw.toCharArray();
//使用内存输入流 读取获得内存中的保存数据的数组
CharArrayReader car = new CharArrayReader(ch);
//读
int len2;
char[] c = new char[10];
while ((len2 = car.read(c)) != -1)
{
System.out.print(new String(c, 0, len2));
}
//因为CharArrayReader extends Reader 因此可以很方便的将其转化为LineNumberReader、BufferedReader;
LineNumberReader propFileBr = new LineNumberReader(car);
String lineProp = null;
while ((lineProp = propFileBr.readLine()) != null)
{
String propKeyValuePair = lineProp.trim();
System.out.println(propFileBr.getLineNumber() + "------\t" + propKeyValuePair + "\t------");
}
}
}
执行结果如下所示: