程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 畢向東_Java基礎視頻教程第19天_IO流(06~10),_java_io

畢向東_Java基礎視頻教程第19天_IO流(06~10),_java_io

編輯:JAVA綜合教程

畢向東_Java基礎視頻教程第19天_IO流(06~10),_java_io


第19天-06-IO流(裝飾設計模式)

  • 裝飾設計模式: 當想要對已有的對象進行功能增強時, 可以定義類,將已有對象傳入,基於已有的功能,並提供加強功能。那麼這個自定義的類稱為裝飾類。
  • 裝飾類通常會通過構造方法接收被裝飾的對象。 並基於被裝飾的對象的功能,提供更強的功能。

第19天-07-IO流(裝飾和繼承的區別)

MyReader                //專門用於讀取數據的類
|----MyTextReader
|----MyMediaReader
|----MyDataReader
|____MyBufferReader

class MyBufferReader{
MyBufferReader(MyTextReader text){}
MyBufferReader(MyMediaReader media){}
MyBufferReader(MyDataReader data){}
...
}

上面的模式類擴展性很差,可以通過找到其參數的共同類型,通過多態的形式,可以提高擴展性
class MyBufferReader extends MyReader{
private MyReader r;
MyBufferReader(MyReader r){}
...
}

裝飾模式比繼承要靈活,避免了繼承體系的臃腫,而且降低了類與類的關系(繼承結構 --> 組合結構).
裝飾類因為增強已有對象,具備的功能和已有的類是相同的,只是提供了更強的功能,所以裝飾類和被裝飾類通常都屬於同一個體系中的.

 第19天-08-IO流(自定義裝飾類)

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

class MyBufferedReader extends Reader {

    private Reader r;
    MyBufferedReader(Reader r) {
        this.r = r;
    }

    //可以一次讀一行數據的方法。
    public String myReadLine() throws IOException {
        //定義一個臨時容器。原BufferReader封裝的是字符數組。為了演示方便。定義一個StringBuilder容器。因為最終還是要將數據變成字符串。
        StringBuilder sb = new StringBuilder();
        int ch;
        while ((ch = r.read()) != -1) {
            if (ch == '\r') continue;

            if (ch == '\n') {
                return sb.toString();
            } else {
                sb.append((char) ch);
            }
        }
        if (sb.length() != 0) return sb.toString();
        return null;
    }

    /*
    覆蓋Reader類中的抽象方法。read(char[] cbuf, int off, int len)和close()是Reader的抽象方法,必須實現。
    */
    public int read(char[] cbuf, int off, int len) throws IOException {
        return r.read(cbuf, off, len);
    }

    public void close() throws IOException {
        r.close();
    }

    public void myClose() throws IOException {
        r.close();
    }
}

class MyBufferedReaderDemo {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("buf.txt");
        MyBufferedReader myBuf = new MyBufferedReader(fr);

        String line;
        while ((line = myBuf.myReadLine()) != null) {
            System.out.println(line);
        }

        myBuf.myClose();
    }
}

第19天-09-IO流(LineNumberReader)

import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;

public class LineNumberReaderDemo {

    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("buf.txt");
        LineNumberReader lnr = new LineNumberReader(fr);

        String line;
        lnr.setLineNumber(2); //設置當前行號。參數:lineNumber - 指定行號的 int 值
        while ((line = lnr.readLine()) != null) {
            System.out.println(lnr.getLineNumber() + ":" + line);
        }
        lnr.close();
    }
}

3:abcde1             #行號從setLineNumber的下一位3開始標記
4:abcde2
5:abcde3
6:abcde4

第19天-10-IO流(MyLineNumberReader)

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class MyLineNumberReader extends MyBufferedReader {

    private int lineNumber;

    public MyLineNumberReader(Reader r) {
        super(r);
    }

    public void setLineNumber(int lineNumber) {
        this.lineNumber = lineNumber;
    }

    public int getLineNumber() {
        return lineNumber;
    }

    public String myReadLine() throws IOException {
        lineNumber++;
        return super.myReadLine();
    }
}

class MyLineNumberReaderDemo {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("buf.txt");
        MyLineNumberReader mylnr = new MyLineNumberReader(fr);

        mylnr.setLineNumber(200);
        String line;
        while ((line = mylnr.myReadLine()) != null) {
            System.out.println(mylnr.getLineNumber() + "::" + line);
        }

        mylnr.myClose();
    }
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved