1. 程式人生 > >記憶體操作流 列印流 列印流格式化輸出

記憶體操作流 列印流 列印流格式化輸出

什麼是記憶體流

熟知的有檔案流,也就是對檔案進行IO處理,但IO操作也可在記憶體中,這種流稱為記憶體操作流。
檔案流是以檔案為操作終端,會產生檔案(不論檔案資料是否儲存),但是記憶體流是以記憶體為操作終端,不會產生檔案。
記憶體流分為2類:
1.位元組記憶體流:ByteArrayInputStream、ByteArrayOutputStream
2.字元記憶體流:CharArrayReader、CharArrayWriter

//位元組記憶體流繼承關係
public class ByteArrayInputStream extends InputStream ;
public class ByteArrayOutputStream extends OutputStream;

//字元記憶體流繼承關係:
public class CharArrayReader extends Reader;
public class CharArrayWriter extends Writer;

在這裡插入圖片描述
在這裡插入圖片描述
在檔案流中,會建立一個File終端物件,因為不知道要操作哪個檔案,但是在記憶體流中,要操作的終端只有一個記憶體,所以不用手動建立記憶體終端物件。

用記憶體流實現大小寫轉換:

package CODE.JavaIo;

import java.io.*;

public class Mem {
    public static void main(String[] args) throws IOException {
        String str="hello pick";
        //輸入輸出流:
        ByteArrayInputStream in=
new ByteArrayInputStream(str.getBytes());//輸入流,要輸入的資料儲存到記憶體中 ByteArrayOutputStream out =new ByteArrayOutputStream(); //輸出流 //輸入輸出資料 int len=0; //一次讀取一個位元組,將讀取到的資料大寫然後寫入記憶體 while((len=in.read())!=-1) { out.write(Character.toUpperCase(len)); }
System.out.println(out); //HELLO PICK out.close(); in.close(); } }

發生了IO操作,但是沒有檔案產生,可以理解為一個臨時檔案處理。
列印流

OutputStream的write只能接受位元組陣列,列印流是為了可以接收很多型別資料(int double String等),但核心依然是OutputStream。
簡單設計一個列印流:

package CODE.JavaIo;


import java.io.*;

//設計一個簡單的列印流
class PrintUtil
{
    private OutputStream out;
    //類外部傳入輸出流
    public PrintUtil(OutputStream out)
    {
        this.out=out;
    }
    //核心方法
    public void print(String str)
    {
        try {
            out.write(str.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void println(String str)
    {
        print(str+"\r\n");
    }
    public void print(int n)
    {
        print(String.valueOf(n));
    }
    public void println(int n)
    {
        println(String.valueOf(n));
    }
    public void print(double d)
    {
        print(String.valueOf(d));
    }
    public void println(double d)
    {
        println(String.valueOf(d));
    }
    public void close()
    {
        try {
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
public class printStream {
    public static void main(String[] args) throws Exception {
        File file=new File("C:"+File.separator+"Users"+
                File.separator+ "lenovo"+File.separator+"Desktop"+
                File.separator+"Test.txt");
        OutputStream out=new FileOutputStream(file);
        PrintUtil printUtil=new PrintUtil(out);
        printUtil.print("姓名:");
        printUtil.println("pick");
        printUtil.print("年齡");
        printUtil.println(18);
        printUtil.close();
    }
}

在這裡插入圖片描述

系統提供的列印流

1.位元組列印流:PrintStream
2.字元列印流:PrintWriter

在這裡插入圖片描述
在這裡插入圖片描述

////系統提供的位元組列印流
public class printStream {
    public static void main(String[] args) throws Exception {
        File file=new File("C:"+File.separator+"Users"+
                File.separator+ "lenovo"+File.separator+"Desktop"+
                File.separator+"Test.txt");
        OutputStream out=new FileOutputStream(file);
        PrintStream printUtil=new PrintStream(out);
        printUtil.print("姓名:");
        printUtil.println("pick");
        printUtil.print("年齡");
        printUtil.println(18);
        printUtil.close();
    }
}

列印流應用的是裝飾設計模式(基於抽象類的設計模式),核心依然是某個類(OutputStream)的功能(write()),但是為了得到更好的效果,讓其支援的功能更多。
可以很方便的擴充套件裝飾類,裝飾類不同,功能不同。
優點:擴充套件功能方便,需要不同的功能,只需要更換裝飾類。
缺點:類結構複雜。

位元組列印流格式化輸出

在JDK1.5後,有了格式化輸出。

public PrintStream printf(String format, Object ... args)

例:

////系統提供的位元組列印流
public class printStream {
    public static void main(String[] args) throws Exception {
        File file=new File("C:"+File.separator+"Users"+
                File.separator+ "lenovo"+File.separator+"Desktop"+
                File.separator+"Test.txt");
        OutputStream out=new FileOutputStream(file);
        PrintStream printUtil=new PrintStream(out);
        printUtil.printf("姓名:%s 年齡:%d","pick",18);
    }
}

String的格式化輸出

//靜態方法
public static String format(String format, Object... args)
////String的格式化輸出
public class printStream {
    public static void main(String[] args) throws Exception {
       String str=String.format("姓名:%s 年齡:%d","pick",18);
        System.out.println(str);
    }
}