1. 程式人生 > >java第20天----字元緩衝流,位元組流,標準輸入流,裝飾設計模式,介面卡設計模式

java第20天----字元緩衝流,位元組流,標準輸入流,裝飾設計模式,介面卡設計模式

昨天知識總結

  • 1.流的基礎
  • 2.流的分類
  • 3.字元流
    • 讀 FileReader
    • 寫 FileWriter
  • 4.File

字元緩衝流

  • 字元緩衝流:又叫字元緩衝區,為了提高讀寫的能力,本身沒有讀寫的能力,要想進行讀寫,必須依靠字元流來實現。
  • 可以將緩衝流比作催化劑或者高速的小車
  • 字元緩衝流分類:
    • 1.字元緩衝讀入流:BufferedWriter 輔助讀,沒有讀的能力 在這裡插入圖片描述
    public static void main(String[] args) throws IOException {
		//1.建立緩衝寫入流,並關聯寫出流
		BufferedWriter bufferedWriter =
new BufferedWriter(new FileWriter("test.txt")); //2.寫 bufferedWriter.write("bingbing"); /* * 換行:優點:有跨平臺性 */ bufferedWriter.newLine(); bufferedWriter.write("bingbing2"); //3.關閉流。a.關閉寫出流 b.重新整理 c.關閉緩衝寫出流 bufferedWriter.close(); }
    • 2.字元緩衝寫出流:BufferedReader 輔助寫,沒有寫的能力
public static
void main(String[] args) throws IOException { /* *1.字元緩衝讀入流:BufferedReader 輔助讀,沒有讀的功能 * */ //1.建立字元緩衝讀入流的物件 BufferedReader reader = new BufferedReader(new FileReader("test.txt")); //2.讀 //a:一次讀一個字元 // int num; // while((num = reader.read())!=-1) { // System.out.println((char)num); // }
//b:一次讀多個字元 // int num; // char[] arr = new char[4]; // while((num= reader.read(arr))!=-1) { // System.out.println(new String(arr,0,num)); // } //c.一次讀一行-readLine() //特點:不會將當前的換行符返回,返回值就是我們讀到的內容,以字串的形式返回,當返回null的時候,就讀完了 String data = null; while((data = reader.readLine())!=null) { System.out.print(data); System.out.println();//列印控制檯時候使用的換行符 } //3.關閉流 reader.close(); }

LineNumberReader

  • LineNumberReader:是BufferedReader的子類,不能讀,但是可以提高效率,,其他功能:設定行號,獲取行號
    public static void main(String[] args) throws IOException {
		
		//1.建立緩衝流
		LineNumberReader lineNumberReader = new LineNumberReader(new FileReader("src\\com\\qianfeng\\test\\Demo2.java"));
		
		//設定行號:
		//注意點:預設從0 開始設定,從1開始計數
		lineNumberReader.setLineNumber(0);
		
		//2.讀
		String data = null;
		while((data = lineNumberReader.readLine())!= null) {
			System.out.print(lineNumberReader.getLineNumber());//獲取行號
			System.out.print(data);
			System.out.println();
		}
		//3.關閉流
		lineNumberReader.close();
	}

位元組流

  • 字元流:傳輸的是位元組,只能用於字元的傳輸
    • 字元讀入流:Reader
      • read() reader(陣列)
    • 字元寫出流:Writer
      • writer(int c) writer(char() arr) writer(String s)
    • 緩衝字元讀入流BufferedReader
      • readLine()
    • 緩衝字元寫出流BufferedWriter
      • newLine()
  • 位元組流:傳輸的是位元組,可以傳輸所有內容
    • 位元組輸入流InputStream
    • 位元組輸出流OutputStream
    • 緩衝位元組輸入流:BufferedInputStream
    • 緩衝位元組輸出流:BufferedOutputStream
//寫
	public static void writerFile() throws IOException {
		OutputStream outputStream = new FileOutputStream("temp2.txt");
		outputStream.write("bingbing".getBytes());//使用預設的格式編碼
		outputStream.close();
	}
	//讀1--一次一個位元組
	public static void readerFile1() throws IOException {
		InputStream inputStream = new FileInputStream("temp2.txt");
		int num;
		while((num = inputStream.read())!=-1) {
			System.out.println((char)num);
		}
		inputStream.close();
	}
	//讀2----一次讀多個位元組
	public static void readFile2() throws IOException {
		InputStream inputStream = new FileInputStream("temp2.txt");
		int num;
		byte[] arr = new byte[4];
		while((num = inputStream.read())!=-1) {
			System.out.println(new String(arr,0,num));
		}
		inputStream.close();
	}
	//讀3---一次全部讀出
	public static void readFile3() throws IOException {
		InputStream inputStream = new FileInputStream("temp2.txt");
		//獲取的所有位元組數
		//如果文字的位元組數過大,不建議使用
		int nums = inputStream.available();
		byte[] arr = new byte[nums];
		int num = inputStream.read(arr);
		//while((num = inputStream.read())!=-1) {
		System.out.println(new String(arr,0,num));
		//}
		inputStream.close();
	}

標準輸入流

  • 標準輸入流:System.in.:此流已經被開啟,這個流預設對應鍵盤(輸入源)或由主機或由使用者提供的輸入源
public static void main(String[] args) throws IOException {
		//標準輸入流	輸入源:鍵盤	中轉點:記憶體	輸出源:控制檯
		InputStream inputStream = System.in;//這個流已經預設綁定了鍵盤,所以可以之際從鍵盤接受資料,這個是位元組流
		
//		int num = inputStream.read();//是一個阻塞式方法,會一直等待使用者輸入
//		System.out.println(num);
		
		/*
		 * 例項:要求可以從鍵盤不斷地接受位元組,
		 * 一行一行的接收
		 */
		myReadLine(inputStream);
	}
	public static void myReadLine(InputStream inputStream) throws IOException {
		StringBuffer buffer = new StringBuffer();
		while(true) {
			int num = inputStream.read();
			if(num == '\r') {
				continue;
			}else if(num == '\n') {
				System.out.println(buffer.toString());
				//當輸入over的時候認為是結束
				if(buffer.toString().equals("over")) {
					break;
				}
				buffer.delete(0, buffer.length());
			}else {
				buffer.append((char)num);
			}
			
		}
	}

裝飾設計模式

  • 裝飾設計模式:基於已經實現的功能,提供增強的功能
  • 裝飾設計模式的由來就來自於對緩衝流的實現
  • 特點:從緩衝流的角度講解
    • 1.使流原來的繼承體更加的簡單
    • 2.提高了效率
    • 3.由於是在原有的基礎上提高了增強的功能,所以他還要屬於原來的體系
  • 演示:如果自己設計裝飾設計模式,怎麼處理?
    • 1.原來的類:Test
    • 2.裝飾類:Btest
  • 步驟:
    • 1.讓BTest繼承自Test
    • 2.在BTest內有一個Test型別的成員變數
    • 3.通過BTest內一個帶引數的構造方法接收外部傳入的一個Test型別的物件,交給內部的Test的屬性
    • 4.實現功能的時候,呼叫傳入的Test型別的物件實現原有的功能,自己實現增強的功能
  • 實現BufferedReader的重寫
  • 分析:
    • 1.要屬於流的體系
    • 2.要有一個Reader型別的成員變數
    • 3.要有一個帶引數的方法接受外部的流物件
    • 4.模擬readLine()方法,實現度一行的功能
    • 5.重寫close()方法
//1.要屬於流的體系
class MyBufferReader extends Reader{
	// 2.要有一個Reader型別的成員變數
	Reader reader;
	//3.要有一個帶引數的方法接受外部的流物件
	public MyBufferReader(Reader reader) {
		// TODO Auto-generated constructor stub
		this.reader = reader;
	}
	
	//4.模擬readLine()方法,實現度一行的功能
	public String readLine() throws IOException {
		//a:準備一個臨時的可變字串,儲存當前行的內容
		StringBuffer str = new StringBuffer();
		//b:開始讀
		int data;					
		while((data = reader.read())!=-1) {
			if(data=='\n') {//停止讀
				return str.toString();
			}else if(data == '\r') {//繼續讀
				continue;	
			}else {
				str.append((char)data);
			}
		}
		//c.當文字沒有內容是的處理
		if(str.length()==0) {
			return null;
		}
		//d:當文字只有一行,沒有換行符
		return str.toString();
		//e:這裡寫提高效率的程式碼
	}
	
	
	
	
	
	@Override
	public int read(char[] cbuf, int off, int len) throws IOException {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void close() throws IOException {
		// TODO Auto-generated method stub
		//關閉讀入流
		this.reader.close();
		//將自己關閉
		//this.close();
	}
	
}

介面卡設計模式

  • 介面卡設計模式:通常可以變相的理解成裝飾設計模式
  • 例項:要求在子類中只是用play方法
  • 分析:Dog是繼承了ZiMidel類,ZiMidel類是想了Inter介面
  • 當Dog類想要實現Inter介面的一個方法的時候,如果直接實現Inter介面,就必須將所有的方法都實現。
  • 如果在Dog類與Inter介面之間插入一個可,讓這個類去實現Inter介面的所有方法,作為這個類的子類只需要實現自己需要的方法
  • 我們將中間的這個類成為介面卡類
interface Inter{
	public void play();
	public void song();
	public void run();
	public void eat();
	public void jump();
}
//介面卡類
class ZiMidel implements Inter{

	@Override
	public void play() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void song() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void eat() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void jump() {
		// TODO Auto-generated method stub
		
	}
	
}


//建立狗類,我只想讓她實現play方法?
class Dog extends ZiMidel{
	public void play() {
		// TODO Auto-generated method stub
		
	}
}

class Cat extends ZiMidel{
	public void song() {
		
	}
}