棟哥帶你學Java跟蹤行號流、裝飾者模式以及列印流
阿新 • • 發佈:2019-02-01
跟蹤行號流
跟蹤行號字元輸入流:LineNumberReader
這個流有什麼特點呢?
沒什麼特別的特點,就是可以獲取行號.
public void fun() throws FileNotFoundException, IOException {
FileReader fr = new FileReader("/Users/xsd/Desktop/line.txt");
LineNumberReader lnr = new LineNumberReader(fr);
String string = "";
while ((string = lnr.readLine()) != null ) {
System.out.println(lnr.getLineNumber() + ":" + string);
}
lnr.close();
}
獲取行號的方法:getLineNumber(),每讀一行它的行號就會自增,也可以自己設定行號setLineNumber().
裝飾者模式
什麼是裝飾者模式?
裝飾者模式就是通過裝飾,對原來的功能進行升級.簡單的舉個例子,我們會拼音打字,去了培訓五筆輸入法
的培訓機構出來,我們不僅會拼音打字,也會用五筆打字了.這就是裝飾者模式的思想.
裝飾者模式的步驟:先把被裝飾者寫成成員變數,然後再構造方法中給該成員賦值,接著對該成員原有的功能升級.
這裡給大家出個題,使用裝飾者模式讓Reader實現可以讀取一整行的功能.一下是我的程式碼,僅供參考.
class MyReader {
// 被裝飾者 寫成成員變數
private Reader rd;
// 記錄行號
private int number = 0;
// 構造方法
public MyReader() {
// TODO Auto-generated constructor stub
}
public MyReader(Reader rd) {
this.rd = rd;
}
// 功能升級 從讀位元組 升級 到讀行
public String myRead() throws IOException {
int len = 0;
StringBuffer sb = new StringBuffer();
while ((len = rd.read()) != -1) {
// 進行換行
// 遇到換行 這一行字串 已經拼接完畢 之間返回就行
if (len == '\n') {
number++;
return sb.toString();
} else {
sb = sb.append((char)len);
}
}
if (sb.length() == 0) {
return null;
}
return sb.toString();
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
// 關閉資源
public void close() throws IOException {
rd.close();
}
}
列印流
列印流有兩種,一種是輸出位元組的PrintStream,還有一種是輸出字元的PrintWriter.
列印流的特點:列印流只能作為資料的目的地,而且可以把資料原樣輸出,並且永遠不會拋IO異常,但是可以丟擲
其它的異常,例如空指標異常等.列印流其實也就是相當於給其它的流物件裝飾了一個原樣輸出的功能.
構造方法:構造方法引數可以接收檔案,可以接收位元組輸出流,也可以是檔案路徑.輸出流的構造方法很靈活,可
以說是除了不能傳輸入流之外,都能用得到了.
下面給幾個例子大家可以去試試,流都差不多也不細講了,學會一個流之後其它的看看文件試試就行了.
public void fun1() throws IOException {
// 建立檔案
File file = new File("/Users/xsd/Desktop/print.txt");
FileOutputStream fos = new FileOutputStream(file);
// 建立緩衝位元組輸出流
BufferedOutputStream bos = new BufferedOutputStream(fos);
// 建立一個列印位元組流
PrintStream ps = new PrintStream(bos);
// 寫資料
ps.println("HelloWorld");
ps.println(true);
ps.write(100);
// 關閉資源
ps.close();
}
public void fun2() throws IOException {
// 列印字元流
// 建立檔案
File file = new File("/Users/lanou/Desktop/print.txt");
PrintWriter pw = new PrintWriter(file);
pw.print("haha");
pw.println(200);
pw.println(false);
// 重新整理
pw.flush();
pw.close();
}
平時我們經常用的Scanner接收鍵盤輸入也是一個流.我們可以列印看看.
System.out.println(System.in);
然後我們就會它其實用的是BufferedInputStream緩衝輸入位元組流.
作用:接收鍵盤輸入的內容
除了System.in還有System.out
System.out.println(System.out);
System.out 是 PrintStream 列印輸出位元組流
作用:輸出內容到控制檯