Java學習總結:46(內存流)

內存流

在Java中,針對內存操作提供了以下兩組類:

  • 字節內存流:ByteArrayInputStream(內存字節輸入流)、ByteArrayOutputStream(內存字節輸出流);
  • 字符內存流:CharArrayReader(內存字符輸入流)、CharArrayWriter(內存字符輸出流)。

這兩者的唯一區別就在於操作數據類型上,字節內存流使用byte數據類型,而字符內存流操作則使用char數據類型,但是他們的基本結構相同,博主着重講字節內存流的使用。

字節內存流定義的構造方法如下:

  • ByteArrayInputStream類構造:public ByteArrayInputStream(byte[] buf);
  • ByteArrayOutputStream類構造:public ByteArrayOutputStream()。

內存流的操作實質上就是將數據首先保存到內存中,然後利用IO流操作進行單個字節的處理。

例:實現一個小寫字母轉大寫字母的操作

  • 本程序不使用String類中提供的toUpperCase()方法,而是利用IO操作,將每一個字節進行大寫字母的轉換;
  • 爲了方便地實現字母的轉大寫操作(避免不必要的字符也被轉換)可以藉助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)。
package Project.Study.TMemoryStream;

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

public class Test1 {
    public static void main(String[]args)throws Exception{
        String str="Hello World!!!";//需要轉換的字符串
        //本次將通過內存操作流實現轉換,先將數據保存在內存流裏面,再從裏面取出每一個數據
        //將所有要讀取的數據設置到內存輸入流中,本次利用向上轉型爲InputStream類實例化
        InputStream inputStream=new ByteArrayInputStream(str.getBytes());
        OutputStream outputStream=new ByteArrayOutputStream();//爲了能夠將所有的內存流數據取出,可以使用ByteArrayOutputStream
        int temp=0;
        //經過此次循環後,所有數據都將保存在內存輸出流對象中
        while((temp=inputStream.read())!=-1){//每次讀取一個數據
            //將讀取進來的數據轉換爲大寫字母,利用Character.toUpperCase()可以保證只轉換字母
            outputStream.write(Character.toUpperCase(temp));//字節輸出流
        }
        System.out.println(outputStream);//調用toString()方法
        inputStream.close();    //關閉輸入流
        outputStream.close();   //關閉輸出流
    }
}
//結果:
//HELLO WORLD!!!

在ByteArrayOutputStream類裏面存在一個重要的方法,可以通過內存輸出流取得全部數據:public byte[] toByteArray(),此方法可以將所有暫時保存在內存輸出流中的字節數據全部以字節數組的形式返回,而利用這樣的方法,就可以實現多個文件的合併讀取操作。

例:實現文件的合併讀取

package Project.Study.TMemoryStream;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class Test2 {
    public static void main(String[]args)throws Exception{
        File fileA=new File("d:"+File.separator+"Test1"+File.separator+"test.txt"); //文件路徑
        File fileB=new File("d:"+File.separator+"Test1"+File.separator+"test2.txt");
        InputStream inputStreamA=new FileInputStream(fileA);    //字節輸入流
        InputStream inputStreamB=new FileInputStream(fileB);
        ByteArrayOutputStream output=new ByteArrayOutputStream();//內存輸出流
        int temp=0;                             //每次讀一個字節
        while((temp=inputStreamA.read())!=-1){  //循環讀取數據
            output.write(temp);                 //將數據保存到輸出流
        }
        while((temp=inputStreamB.read())!=-1){
            output.write(temp);
        }
        //現在所有的內容都保存在了內存輸出流裏面,所有的內容變爲字節數組取出
        byte[]data=output.toByteArray();        //取出全部數據
        output.close();                         //關閉輸出流
        inputStreamA.close();
        inputStreamB.close();
        System.out.println(new String(data));   //字節轉換爲字符串輸出
    }
}
//結果:
//Hello World!!!
//Hi!!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章