java第20天----字元緩衝流,位元組流,標準輸入流,裝飾設計模式,介面卡設計模式
阿新 • • 發佈:2018-12-13
昨天知識總結
- 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()
- 字元讀入流:Reader
- 位元組流:傳輸的是位元組,可以傳輸所有內容
- 位元組輸入流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() {
}
}