IO流01--畢向東JAVA基礎教程視頻學習筆記

来源:http://www.cnblogs.com/wsw-tcsygrwfqd/archive/2016/01/09/5115453.html
-Advertisement-
Play Games

提要01 IO流(BufferedWriter)02 IO流(BufferedReader)03 IO流(通過緩衝區複製文本文件)04 IO流(readLine的原理)05 IO流(MyBufferedReader)06 IO流(裝飾設計模式)07 IO流(裝飾和繼承的區別)01 IO流(Buffe...


 

提要

01 IO流(BufferedWriter)
02 IO流(BufferedReader)
03 IO流(通過緩衝區複製文本文件)
04 IO流(readLine的原理)
05 IO流(MyBufferedReader)
06 IO流(裝飾設計模式)
07 IO流(裝飾和繼承的區別)

01 IO流(BufferedWriter)
字元流的緩衝區
緩衝區的出現提高了對數據的讀寫效率。
對應類
BufferedWriter
BufferedReader
緩衝區要結合流才可以使用
在流的基礎上對流的功能進行了加強

 1 /*
 2 緩衝區的出現是為了提高流的操作效率,
 3 所以在創建緩衝區之前,必須要先有流對象。
 4 
 5 該緩衝區提供了一個跨平臺的換行方法 newLine()
 6 */
 7 import java.io.*;
 8 public class BufferedWriterDemo
 9 {
10     public static void main(String[] args)throws IOException
11     {
12         //創建一個字元寫入流對象
13         FileWriter fw=new FileWriter("buf.txt");
14         
15         //為了提高字元寫入流效率,加入了緩衝區
16         //只要將需要被提高效率的流對象作為參數傳遞給緩衝區的構造函數即可
17         BufferedWriter bufw=new BufferedWriter(fw);
18         
19         for(int x=1;x<5;x++)
20         {
21             bufw.write("abcde"+x);
22             //寫入一個行分隔符,是跨平臺的
23             bufw.newLine();
24             //記住,只要用到緩衝區,就要記得刷新
25             bufw.flush();
26         }
27         
28         //其實,關閉緩衝區,就是在關閉緩衝區流中的對象
29         bufw.close();
30             
31 
32         
33 
34     }
35 }

 


02 IO流(BufferedReader)

 1 /*
 2 字元讀取緩衝區
 3 該緩衝區提供了一個一次讀一行的方法,readLine()
 4 */
 5 import java.io.*;
 6 public class BufferedReaderDemo
 7 {
 8     public static void main(String[] args)throws IOException
 9     {
10         //創建一個讀取流對象和文件相關連
11         FileReader fr=new FileReader("buf.txt");
12 
13         //為了提高效率,加入緩衝技術,
14         //將字元讀取流對象作為參數傳遞給緩衝對象的構造函數
15         BufferedReader bufr=new BufferedReader(fr);
16 
17         String line;
18 
19         while((line=bufr.readLine())!=null)
20         {
21             System.out.println(line);
22         }
23 
24         bufr.close();
25     }
26 }

 


03 IO流(通過緩衝區複製文本文件)

註意:readLine方法只返回回車符前面的部分,並不返回回車符。

 1 /*
 2 通過緩衝區複製一個.java文件
 3 */
 4 import java.io.*;
 5 public class CopyTextByBuf
 6 {
 7     public static void main(String[] args)
 8     {
 9         BufferedReader bufr=null;
10         BufferedWriter bufw=null;
11 
12         try
13         {
14             bufr=new BufferedReader(new FileReader("BufferedWriterDemo.java"));
15             bufw=new BufferedWriter(new FileWriter("buffferWriter_Copy.txt"));
16 
17             String line;
18             while((line=bufr.readLine())!=null)
19             {
20                 bufw.write(line);
21                 bufw.newLine();
22                 bufw.flush();
23             }
24         }
25         catch (IOException e)
26         {
27             throw new RuntimeException("讀寫失敗!");
28         }
29         finally
30         {
31             try
32             {
33                 if(bufr!=null)
34                     bufr.close();
35             }
36             catch (IOException e)
37            {
38             throw new RuntimeException("讀取關閉失敗!");
39            }
40            try
41             {
42                 if(bufw!=null)
43                     bufw.close();
44             }
45             catch (IOException e)
46            {
47             throw new RuntimeException("寫入關閉失敗!");
48            }
49         }
50     }
51 }

 


04 IO流(readLine的原理)

無論是讀一行,或者讀取多個字元,其實最終都是在硬碟上一個一個讀取,所以最終使用的還是read方法一次一次讀取。


05 IO流(MyBufferedReader)

 1 /*
 2 明白了BufferedReader類中特有方法reaLine的原理後,
 3 可以自定義一個類中包含一個功能和readLine一致的方法。
 4 來模擬一下BufferedReader
 5 
 6 */
 7 import java.io.*;
 8 class MyBufferedReader
 9 {
10     private FileReader r;
11     MyBufferedReader(FileReader r)
12     {
13         this.r=r;
14     }
15     //可以一次讀一行數據的方法
16     public String myReadLine() throws IOException
17     {
18         //定義一個臨時容器,原BufferReader封裝的是字元數組
19         //為了演示方便,定義一個StringBuilder容器
20         //因為最終還是要將數據變成字元串
21 
22         StringBuilder sb=new StringBuilder();
23         int ch=0;
24         while((ch=r.read())!=-1)
25         {
26             if(ch=='\r')
27                 continue;
28             if(ch=='\n')
29                 return sb.toString();
30             else
31                 sb.append((char)ch);
32         }
33         if(sb.length()!=0)
34             return sb.toString();
35         return null;
36     }
37     public void myClose()throws IOException 
38     {
39         r.close();
40     }
41 }
42 
43 public class MyBufferedReaderDemo
44 {
45     public static void main(String[] args) throws IOException
46     {
47         FileReader fr=new FileReader("buf.txt");
48 
49         MyBufferedReader myBuf=new MyBufferedReader(fr);
50         String line=null;
51         while((line=myBuf.myReadLine())!=null)
52         {
53             System.out.println(line);
54         }
55         myBuf.myClose();
56 
57     }
58 }

 


06 IO流(裝飾設計模式)

 1 /*
 2 裝飾設計模式:
 3 當想要對已有的對象進行功能增強時,
 4 可以定義類,將已有對象傳入,基於已有功能,並提供加強功能
 5 那麼自定義的這個類就成為裝飾類
 6 
 7 裝飾類通常會通過構造方法接收被裝飾的的對象
 8 並基於被裝飾對象的功能,提供更強的功能
 9 */
10 class Person
11 {
12     public void chiFan()
13     {
14         System.out.println("吃飯");
15     }
16 }
17 class SuperPerson
18 {
19     private Person p;
20     public SuperPerson(Person p)
21     {
22         this.p=p;
23     }
24     public void superChiFan()
25     {
26         System.out.println("開胃酒");
27         p.chiFan();
28         System.out.println("甜點");
29         System.out.println("來一根");
30 
31     }
32 }
33 public class PersonDemo 
34 {
35     public static void main(String[] args) 
36     {
37         SuperPerson sp=new SuperPerson(new Person());
38         sp.superChiFan();
39 
40     }
41 }

 


07 IO流(裝飾和繼承的區別)

用繼承體系來實現功能增強
MyReader//專門用於讀取數據的類
|--MyTextReader
  |--MyBufferTextReader
|--MyMediaTextReader
  |--MyBufferMediaReader
|--MyDataReader
  |--MyBufferDataReader

class MyBufferReader
{
MyBufferReader(MyTextReader text)
{}
MyBufferReader(MyMediaTextReader media text)
{}

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


用裝飾來實現功能增強
MyReader//專門用於讀取數據的類
|--MyTextReader
|--MyMediaReader
|--MyDataReader
|--MyBufferReader

裝飾模式比繼承要靈活,避免了繼承體系的臃腫
而且降低了類與類之間的關係。

裝飾類因為增強已有對象,具備的功能和已有對象是相同的,
只不過是提供了更強的功能
所以裝飾類和被裝飾類通常是屬於一個體系的

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這一系列文章目的不是講ruby,也不是講selenium-webdriver,而是通過一個登錄soso首頁的小例子講怎樣一步一步寫好自動化測試。目標是:面向對象編程,實現邏輯與數據分離。如果你覺得已經學會了selenium-webdriver這個工具,而且也可以自己寫一些小例子,但是似乎又是在雲里霧...
  • 一、簡介 在一些web、email、database等應用里,比如彩鈴,我們的應用在任何時候都要準備應對數目巨大的連接請求,同時,這些請求所要完成的任務卻又可能非常的簡單,即只占用很少的處理時間。這時,我們的應用有可能處於不停的創建線程並銷毀線程的狀態。雖說比起進程的創建,線程的創建時間已經大大縮短...
  • 題目:Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For example,Given n = 3, your program should return ...
  • NSDate#import int main(int argc, const char * argv[]) { @autoreleasepool { //通過date方法創建的時間對象,對象就保存了當前的時間; /* NSDate *now=[NSDate date]...
  • Object作為對象中的上帝,我們時刻關註著上帝中的行為。但是上帝之手有時候還不太好用,所以我們有時候要進行覆寫。public String toString(){ //code}public boolean equals(Object obj){ // obj 強轉 // 比較...
  • 1.準備工作 (1)PHP 版本5.6.17 下載地址 PHP官網 (2)Nginx 版本1.8.0 下載地址 Nginx官網 (3)MySQL 版本5.7.10MySQL官網2.php的安裝與配置 直接解壓下載好的php包,到D盤wnmp目錄(D:\wnmp),這裡把解壓出來的文件夾重命名...
  • /*** 導入文件Action;*/private File excelFile;// 保存原始文件名private String excelFileFileName;// 保存原始文件名private String importResult;// 將Excel文件解析完畢後信息存放到這個User對...
  • ADO.NET在Java中的對應技術是JDBC,企業庫DataAccessApplicationBlock模塊在Java中的對應是spring-jdbc模塊,EntityFramework在Java中對應的ORM是Hibernate。關係資料庫、SQL、資料庫事務、分散式事務的概念都是通用的。1.J...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...