可以使用內(nèi)存流實(shí)現(xiàn)IO操作篡撵。
在之前使用過了文件操作流實(shí)現(xiàn)了對(duì)于文件數(shù)據(jù)的輸入和輸出操作夭拌,但是如果現(xiàn)在某一種應(yīng)用需要進(jìn)行IO操作,可是又不想產(chǎn)生文件的時(shí)候砾淌,就可以利用內(nèi)存來實(shí)現(xiàn)輸入和輸出的操作即纲。針對(duì)于內(nèi)存流具帮,java.io包提供了兩組操作。
字節(jié)內(nèi)存流:ByteArrayInputStream,ByteArrayOutputStream
字符內(nèi)存流:CharArrayReader,CharArrayWriter
本次是以字節(jié)內(nèi)存流操作為主低斋。下面來看一下
ByteArrayInputStream,ByteArrayOutputStream繼承結(jié)構(gòu)和構(gòu)造方法:
ByteArrayInputStream:
繼承結(jié)構(gòu):
java.lang.Object
java.io.InputStream
java.io.ByteArrayInputStream
構(gòu)造方法:
public ByteArrayInputStream(byte[] buf)
表示將要操作的數(shù)據(jù)設(shè)置到輸入流
ByteArrayOutputStream:
繼承結(jié)構(gòu):
java.lang.Object
java.io.OutputStream
java.io.ByteArrayOutputStream
構(gòu)造方法:
public ByteArrayOutputStream()
從內(nèi)存輸出數(shù)據(jù)
文件操作:
輸出(OutputStream):程序->outputStream->文件
輸入(InputStream):程序<-InputStream<-文件
內(nèi)存操作:
輸出(InputStream):程序->InputStream->內(nèi)存
輸入(OutputStream):程序<-OutputStream<-內(nèi)存
范例:實(shí)現(xiàn)一個(gè)小寫字母轉(zhuǎn)大寫字母的操作
為了方便實(shí)現(xiàn)字母轉(zhuǎn)大寫蜂厅,可以借助于Character類:
public static char toLowerCase(char ch);
public static int toLowerCase(int codePoint)
public static char toUpperCase(char ch);
public static int toUpperCase(int codePoint)
public static void main(String[] args) throws Exception{
String str="Hello world!!";//要轉(zhuǎn)換的字符
//本次要使用內(nèi)存流實(shí)現(xiàn)轉(zhuǎn)換,要將數(shù)據(jù)先保存在內(nèi)存里面膊畴,而后從內(nèi)存里面取出每一個(gè)數(shù)據(jù)
//將所有要讀取的數(shù)據(jù)設(shè)置到內(nèi)存輸入流之中掘猿,本次采用向上轉(zhuǎn)型
InputStream input=new ByteArrayInputStream(str.getBytes());
//為了能夠?qū)⑺械膬?nèi)存流數(shù)據(jù)取出 使用ByteArrayOutputStream
OutputStream output=new ByteArrayOutputStream();
int temp=0;//讀取每一個(gè)字節(jié)數(shù)據(jù)
//經(jīng)過此次while循環(huán),所有數(shù)據(jù)都會(huì)保存在內(nèi)存輸出流對(duì)象中
while((temp=input.read())!=-1){//每次讀取一個(gè)數(shù)據(jù)
output.write(Character.toUpperCase(temp));//字節(jié)輸出流
}
System.out.println(output);//調(diào)用toString方法
input.close();
output.close();
}
成功了
以上的操作代碼里唇跨,所有的輸入和輸出流都發(fā)生了向上轉(zhuǎn)型稠通,向上轉(zhuǎn)型的好處是類型統(tǒng)一,但是我們別忘了买猖,每一個(gè)子類都有每一個(gè)子類自己的功能改橘。
public byte[] toByteArray();
ByteArrayOutputStream這個(gè)方法可以將內(nèi)存中的字節(jié)數(shù)據(jù)化為字節(jié)數(shù)組。
利用這個(gè)ByteArrayOutputStream的子類方法可以實(shí)現(xiàn)多個(gè)文件的同時(shí)讀取政勃。
范例唧龄;實(shí)現(xiàn)文件的合并讀取
public static void main(String[] args) throws Exception{
File fileA=new File("e:"+File.separator+"infoa.txt");
File fileB=new File("e:"+File.separator+"infob.txt");
InputStream inputA=new FileInputStream(fileA);
InputStream inputB=new FileInputStream(fileB);
ByteArrayOutputStream output=new ByteArrayOutputStream();
int temp=0;//每次讀取一個(gè)數(shù)據(jù)
while((temp=inputA.read())!=-1){
output.write(temp);
}
while((temp=inputB.read())!=-1){
output.write(temp);
}
//現(xiàn)在所有的內(nèi)容都保存在了內(nèi)存輸出流里兼砖,所有的內(nèi)容都變成字節(jié)數(shù)組取出奸远。
byte data[]=output.toByteArray();
output.close();
inputA.close();
inputB.close();
System.out.println(new String(data));
}
使用內(nèi)存輸出流同時(shí)讀取了文件a.txt和b.txt
總結(jié):
內(nèi)存操作流既棺,短期內(nèi)不會(huì)使用,需要結(jié)合一些具體的案例才可以更好的理解懒叛。