Java之路:内存操作流

Java提供了内存流机制,可以实现类似于内存虚拟文件的功能。
这样,我们既可以从内存中获取数据,也向内存中写入数据,也就是说,可以将内存作为数据的来源和目的地。内存操作流就是实现向内存中读取和写入数据的流类。

内存操作流一共也分为两组:

(1)字节内存操作流:ByteArrayOutputStream、ByteArrayInputStream;
(2)字符内存操作流:CharArrayWriter、CharArrayReader。

注意:

(1)不管是文件流还是内存流依然要满足向上转型的要求,都要使用到父类方法;
(2)关于两者的操作形式不同(数据的来源和目的地不同):
在这里插入图片描述

对于字节内存操作流而言,ByteArrayInputStream主要完成将数据写入到内存之中,而ByteArrayOutputStream的功能则是将内存中的数据输出。此时,内存作为数据的操作点,如下图所示:
在这里插入图片描述

ByteArrayInputStream是输入流(InputStream)的一种子类实现。

public class ByteArrayInputStream extends InputStream

它有两个构造方法,每个构造方法都需要一个字节byte数组来作为其数据源。

ByteArrayInputStream(byte[] buf)
ByteArrayInputStream(byte[] buf,int offse , int length)

类似地,ByteArrayOutputStream是输出流(OutputStream)的一种子类实现,其继承体系如下所示。

java.lang.Object
|-- java.io.OutputStream
|-- java.io.ByteArrayOutputStream

ByteArrayOutputStream类也有两个构造方法

ByteArrayOutputStream(); // 仅仅在内存当中创建一个字节数组输出流
BuyteArrayoutputStream(int size); // 在内存当中创建一个指定大小的字节数组输出流。

【示例】

package com.xy.io;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class ByteArrayDemo {
	public static void main(String[] args) throws Exception {
		String str = "abcdefghijklmnopqrstuvwxyz";
		byte[] b = str.getBytes();
		ByteArrayInputStream in = new ByteArrayInputStream(b);
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		new ByteArrayDemo().transform(in, out);
		byte[] result = out.toByteArray();
		System.out.println(new String(result));
	}
	
	public void transform(InputStream in, OutputStream out) {
		int c = 0;
		try {
			// 每次读取一个字符,并赋给c
			while((c = in.read()) != -1)	// read()在读到流的结尾处返回-1
			{
				int C = (int)Character.toUpperCase((char)c);
				out.write(C);
			}
		}
		catch(Exception e) {
			e.printStackTrace();
		}
	}
}

【结果】
在这里插入图片描述

在本范例中,实施I/O操作的同时,并没有任何的文件产生,所以也可以把这种基于内存的操作理解为操作临时文件。

猜你喜欢

转载自blog.csdn.net/qq_43555323/article/details/84977915