Java中内存数据流的使用

内存流存在的意义:

    当我们不需要持久化存储数据,而仅仅是需要进行数据中转的时候,就可以使用内存流。

内存流的使用场景:

		 1.代码中需要交换的数据,读写的数据,仅仅是代码之间需要交换,就没必要
	内存 ==》 磁盘   磁盘 ==》内存 【可以在内存读写上提高了效率】
	
	     2.好处:提高了读写的效率,即数据处理的效率 。

内存流的具体实现类:

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

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

CharArrayReader: CharArrayReader extends Reader,此类实现一个可用作字符输入流的字符缓冲区。

CharArrayWriterCharArrayWriter 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: [email protected]
* @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 © 2018 Jun_Zhou
*

  • @ClassName: MemoryStreamDemo.java

  • @Description: 该类的功能描述

  • @version: v1.0.0

  • @author: JunZhou

  • @Email: [email protected]

  • @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------");
     }
    

    }

}

执行结果如下所示:
Java中内存数据流的使用