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

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

提要16 讀取轉換流17 寫入轉換流18 流操作規律-119 流操作規律-220 改變標準輸入輸出設備21 異常的日誌信息22 系統信息16 讀取轉換流字元流體系中的InputStreamReader,是位元組流通向字元流的橋梁:它使用指定的charset讀取位元組並將其解碼為字元。它使用的字元集可以由...


提要

16 讀取轉換流
17 寫入轉換流
18 流操作規律-1
19 流操作規律-2
20 改變標準輸入輸出設備
21 異常的日誌信息
22 系統信息

 

16 讀取轉換流

字元流體系中的InputStreamReader,是位元組流通向字元流的橋梁:它使用指定的charset讀取位元組並將其解碼為字元。

它使用的字元集可以由名稱指定或顯示給定,否則將接受平臺預設的字元集。

 1 /*
 2 通過上一小節15-讀取鍵盤錄入中鍵盤錄入一行數據並列印其大寫,發現就是讀一行數據的原理。
 3 也就是readLine方法。
 4 能不能直接使用readLine方法來完成鍵盤錄入一行數據的讀取呢?
 5 
 6 readLine方法是字元流BufferedReader類中的方法。
 7 而鍵盤錄入的read方法是位元組流InputStream的方法。
 8 
 9 那麼能不能將位元組流轉換成字元流再去使用字元流緩衝區的readLine方法呢。
10 
11 */
12 import java.io.*;
13 public class TransStreamDemo
14 {
15     public static void main(String[] args)throws IOException
16     {
17         //獲取鍵盤錄入對象
18         InputStream in=System.in;
19 
20         //將位元組流轉換為字元流對象,使用轉換流InputStreamReader
21         InputStreamReader isr=new InputStreamReader(in);
22 
23         //為了提高效率,將字元串送入緩衝區,使用BufferedReader
24         BufferedReader bufr=new BufferedReader(isr);
25 
26         String line=null;
27         while((line=bufr.readLine())!=null)
28         {
29             if("over".equals(line))
30                 break;
31             System.out.println(line.toUpperCase());
32         }
33     }
34 }

 


17 寫入轉換流

Writer的直接子類,OutputStreamWriter是字元流通向位元組流的橋梁,可使用指定的charset將寫入流中的字元編碼成位元組。

它使用的字元集可以由名稱指定或者顯示給定,否則將接受平臺預設的字元集。


源:鍵盤錄入(System.in)
目的:控制台(System.out)

 1 /*寫入轉換流,把字元流轉換為位元組流*/
 2 import java.io.*;
 3 public class TransStreamDemo2 
 4 {
 5     public static void main(String[] args) throws IOException
 6     {
 7         //InputStream in=System.in;
 8         //InputStreamReader isr=new InputStreamReader(in);
 9         //BufferedReader bufr=new BufferedReader(isr);
10         //可簡化為
11         //這是最常用的讀取鍵盤錄入
12         BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
13 
14         //OutputStream out=System.out;
15         //OutputStreamWriter osw=new OutputStreamWriter(out);
16         //BufferedWriter bufo=new BufferedWriter(osw);
17         //可簡化為
18         BufferedWriter bufo=new BufferedWriter(new OutputStreamWriter(System.out));
19 
20         String line=null;
21         while((line=bufr.readLine())!=null)
22         {
23             if("over".equals(line))
24                 break;
25             bufo.write(line.toUpperCase());
26             bufo.newLine();
27             //刷新
28             bufo.flush();
29         }
30 
31     }
32 }
View Code

 

18 流操作規律-1

需求:想把鍵盤錄入的數據存儲到一個文件中
源:鍵盤
目的:文件

 1 import java.io.*;
 2 public class TransStreamDemo3 
 3 {
 4     public static void main(String[] args)throws IOException
 5     {
 6         BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
 7 
 8         BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.txt")));
 9 
10         String line=null;
11         while((line=bufr.readLine())!=null)
12         {
13             if("over".equals(line))
14                 break;
15             bufw.write(line.toUpperCase());
16             bufw.newLine();
17             bufw.flush();
18         }
19     }
20 }
View Code

需求:想要將一個文件的數據列印在控制臺上。
源:文件
目的:控制台

 1 import java.io.*;
 2 public class TransStreamDemo4 
 3 {
 4     public static void main(String[] args)throws IOException
 5     {
 6         BufferedReader bufr=new BufferedReader(new InputStreamReader(new FileInputStream("ReadIn.java")));
 7         BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
 8 
 9         String line=null;
10         while((line=bufr.readLine())!=null)
11         {
12             if("over".equals(line))
13                 break;
14             bufw.write(line);
15             bufw.newLine();
16             bufw.flush();
17         }
18         
19     }
20 }
View Code

流操作的基本規律:
最痛苦的就是流對象有很多,不知道該用哪一個
通過三個明確來完成:
1.明確源和目的
源:輸入流,InputStream,Reader
目的:輸出流,OutputStream,Writer
2.操作的數據是否是純文本。
是:字元流
不是:位元組流

3.當體系明確後,再明確要使用哪個具體的對象。
通過設備來區分。
源設備:記憶體,硬碟,鍵盤
目的設備:記憶體,硬碟,控制台


例1:將一個文本文件中的數據存儲到另一個文本文件,即複製文件。
分析過程:
源:因為是源,所以使用讀取流。InputStream,Reader
是不是操作文本文件?
是!這時可以選擇Reader。
這樣體系就明確了。
接下來要明確使用該體系中的那個對象。
明確設備:硬碟上的一個文件
Reader體資中可以操作文件的對象是FileReader。
是否需要提高效率?是!加入Reader體系中的緩衝區,BufferedReader
FileReader fr=new FileReader("a.txt");
BufferedReader bufr=new BufferedReader(fr);


目的:因為是目的,所以使用寫入流。OutputStream,Writer
是否是純文本?
是!Writer
設備:硬碟,一個文件
Writer體系中可以操作文件的對象是FileWriter
是否需要提高效率?是!加入Writer體系中的緩衝區,BufferedWriter

FileWriter fw=new FileWriter("a.txt");
BufferedWriter bufw=new BufferedWriter(fw);


19 流操作規律-2

2.需求:將鍵盤錄入的數據保存到一個文件中
這個需求中,源和目的都存在。
那麼,分別分析。
源:InputStream Reader
是不是純文本? 是!用Reader。
設備:鍵盤,對應的對象是System.in
不是選擇Reader嗎?System.in對應的不是位元組流嗎?
為了操作鍵盤文本數據方便,轉換成字元流按照字元串操作是最方便的。
所以既然明確了Reader,那麼就將System.in轉換成Reader
用了Reader體系的轉換流,InputStreamReader。
InputStreamReader isr=new InputStreamReader(System.in);

需要提高效率嗎?需要!BufferedReader
BufferedReader bufr=new BufferedReader(isr);

目的:OutputStream Writer
是否是純文本文件?是!Writer
設備:硬碟,一個文件,使用FileWriter
FileWriter fw=new FileWriter("c.txt");
需要提高效率嗎?需要!
BufferedWriter bufw=new BufferedWriter(fw);
_____________________________________________
擴展一下,想要把錄入的數據按照指定的編碼表(utf-8)存到文件中。

目的:OutputStream Writer
是否是純文本文件?是!Writer
設備:硬碟,一個文件,使用FileWriter

但是存儲時,需要加入指定的編碼表,而編碼表只有轉換流可以指定。
所以要使用的對象是OutputStreamWriter。
而該轉換流對象要接受一個可以操作文件的位元組輸出流。FileOutputStream
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("d.txt"),"utf-8");

FileWriter fw=new FileWriter("c.txt");
需要提高效率嗎?需要!
BufferedWriter bufw=new BufferedWriter(fw);

 1 import java.io.*;
 2 public class TransStreamDemo5
 3 {
 4     public static void main(String[] args)throws IOException
 5     {
 6         BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
 7         BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),"utf-8"));
 8 
 9         String line=null;
10         while((line=bufr.readLine())!=null)
11         {
12             if("over".equals(line))
13                 break;
14             bufw.write(line);
15             bufw.newLine();
16             bufw.flush();
17         }
18         
19     }
20 }
View Code

同樣用鍵盤輸入“你好!”,使用預設的GBK編碼得到的文件大小是8個位元組。

指定UTF-8編碼得到的文件是11個位元組。

註:

GBK,全稱《漢字內碼擴展規範》,不論中英文均用雙位元組表示。

UTF-8:是用以解決國際上字元的一種多位元組編碼,它對英文使用8位(即一個位元組),中文使用24為(三個位元組)來編碼。UTF-8包含全世界所有國家需要用到的字元,是國際編碼,通用性強。


20 改變標準輸入輸出設備

java.lang包中的System類中有setIn和setOut方法,分別用來重新分配標準輸入流、輸出流。

 1 import java.io.*;
 2 public class TransStreamDemo5
 3 {
 4     public static void main(String[] args)throws IOException
 5     {
 6         //重新分配標準輸入流
 7         System.setIn(new FileInputStream("PersonDemo.java"));
 8 
 9         BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
10         BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
11 
12         String line=null;
13         while((line=bufr.readLine())!=null)
14         {
15             if("over".equals(line))
16                 break;
17             bufw.write(line);
18             bufw.newLine();
19             bufw.flush();
20         }
21         
22     }
23 }
View Code

 


21 異常的日誌信息

把拋出的異常信息寫入日誌文件。

 1 import java.io.*;
 2 import java.util.*;
 3 import java.text.*;
 4 public class ExceptionInfo
 5 {
 6     public static void main(String[] args)
 7     {
 8         try
 9         {
10             int[] arr=new int[2];
11             System.out.println(arr[2]);
12         }
13         catch (Exception e)
14         {
15             try
16             {
17                 Date d=new Date();
18                 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
19                 String s=sdf.format(d);
20 
21                 PrintStream ps=new PrintStream("exception.log");
22                 ps.println(s);
23                 System.setOut(ps);
24             }
25             catch (IOException ie)
26             {
27                 throw new RuntimeException("異常文件創建失敗!");
28             }
29             e.printStackTrace(System.out);
30         }
31     }
32 }
View Code

 

但是,這樣寫比較麻煩,網上有一個專門為java做異常日誌的工具Log4j。


22 系統信息

把系統信息存入文件中。主要用到的方法:

1.System類中的getProperties方法,用來確定當前系統的屬性。

2.Properties類中的list(PrintStream out),將屬性類表輸出到指定的輸出流。

 1 import java.io.*;
 2 import java.util.*;
 3 public class  SystemInfo
 4 {
 5     public static void main(String[] args) throws IOException
 6     {
 7         Properties prop =System.getProperties();
 8         prop.list(new PrintStream("sysinfo.txt"));
 9     }
10 }
View Code

 


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

-Advertisement-
Play Games
更多相關文章
  • OSGI框架為Java定義了一個動態模塊化系統,它使你可以更好地控制代碼結構,動態管理代碼的生命周期,並且提供了代碼寫作的松耦合方式;更值得稱道的是,它的規範文檔描述詳盡。--《OSGI實戰》OSGI分層架構服務層關註於模塊,特別是模塊內的組件間的交互和通信。生命周期層關註於提供執行時模塊管理和對底...
  • 在資料庫中存儲時,使用 Bytes 更精確,可擴展性和靈活性都很高。輸出時,需要做一些適配。1. 註意事項與測試代碼需要考慮sizeInBytes為 None 的場景。除以 1024.0 而非 1024,避免丟失精度。實現的函數為getSizeInMb(sizeInBytes),通用的測試代碼為de...
  • 原文:http://dason.blog.51cto.com/658897/505312Apache虛擬主機配置(多個功能變數名稱訪問多個目錄)為了方便管理虛擬主機,我決定使用一種方法,那就是修改httpd-vhosts.conf文件。第一步首先要使擴展文件httpd-vhosts.conf生效:1. 打開...
  • 原文:http://www.cnblogs.com/weiquxiong/p/3545564.html註:對靜態函數或靜態成員的調用方式不做分析;以下提到的測試環境為vc6.0;調試程式時看到這樣的代碼:1 pObj->ClassName::Function();開始不理解為什麼要在“->”後加上類...
  • 剛剛開始學習Python,第一個編寫的程式。import osuser_file = open('use_file.txt', 'r')user_list = user_file.readlines()user_file.close()while True: lock_file = open(...
  • 本人小白菜逼一枚,,,,剛建立博客,也寫不了太深入的,就寫點上課的筆記什麼的。有錯誤希望廣大博友指出,我一定虛心學習接收改正。我的新浪郵箱:[email protected]我的QQ郵箱:[email protected]電腦網路部分今天主講的tcp和udp協議,這兩協議都是數據鏈路層下...
  • OK!第一篇博文!自賀一下!今日看了此書的前幾頁。嗯,說得挺全,基礎易懂。之前學過c++,但沒用過命令行編譯。本人用的VS里的編譯器,文件名是cl.exe,在VC目錄下。雖然有了編譯器,但並不能直接使用,要配置環境變數。寫個批處理文件,在裡面寫環境變數設置的代碼就行了,如下:@set PATH=D....
  • 直接使用JDBC一個非常普遍的問題是動態SQL。使用參數值、參數本身和數據列都是動態的SQL,通常非常困難。典型的解決方法是,使用一系列if-else條件語句和一連串討厭的字元串連接。對於這個問題,SQLMapAPI使用和mappedstatement非常相似的結構,提供了較為優雅的方法。這裡是一個...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...