記憶體操作流 列印流 列印流格式化輸出
阿新 • • 發佈:2018-12-10
什麼是記憶體流
熟知的有檔案流,也就是對檔案進行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);
}
}