1. 程式人生 > >Java之路:記憶體操作流

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操作的同時,並沒有任何的檔案產生,所以也可以把這種基於記憶體的操作理解為操作臨時檔案。