Java之路:記憶體操作流
阿新 • • 發佈:2018-12-13
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操作的同時,並沒有任何的檔案產生,所以也可以把這種基於記憶體的操作理解為操作臨時檔案。