java流与文件——文本输入输出
【0】README
0.1) 本文描述轉自 core java volume 2, 旨在理解 java流與文件——文本輸入輸出 的相關知識;
0.2) 在保存數據時,可以選擇是二進制還是文本格式; 在存儲文本字符串時, 需要考慮字符編碼方式。
0.3) OutputStreamWriter 和 InputStreamReader
- 0.3.1)OutputStreamWriter 類:將使用選定的字符編碼方式, 把Unicode 字符流轉換為 字節流;
- 0.3.2)InputStreamReader 類:將包含字節的輸入流轉換為 可以產生Unicode碼元的讀入器;
0.4)看個荔枝: 讓一個輸入讀入器從控制臺或文件中讀入信息
- 0.4.1) InputStreamReader in = new InputStreamReader(System.in);
- 0.4.2) InputStreamReader in = new InputStreamReader(new FileInputStream(“a.dat”), “ISO8859_5”);
【1】如何寫出文本輸出
1.1)文本輸出,使用 PrintWriter(打印寫出器): 這個類擁有以文本格式打印字符串和數字的方法, 它甚至還有一個將PrintWriter 鏈接到 FileWriter 的便捷方法, 如下:
PrintWriter out = new PrintWriter("a.txt"); 等價于: PrintWriter out = new PrintWriter(new FileWriter("a.txt"));- 1.1.1)為了輸出到打印寫出器,需要使用 print, println, printf 方法;
- 1.1.2)看個荔枝:
- 1.1.3)行結束符: println 方法添加行結束符(windows 是 “\r\n”, unix是 “\n”),通過調用System.getProperty(“line.separator”) 來獲得字符串;
1.2)自動沖刷模式(干貨——是否開啟自動沖刷模式)
- 1.2.1)如果寫出器設置為 自動沖刷模式, 只要println 被調用, 則緩沖區的所有字符都會被發送到他們的目的地;
- 1.2.2)該模式默認是禁用的, 通過 PrintWriter(Writer out, Boolean autoFlush) 來開啟或禁用自動沖刷機制;
Attention)
- A1) PrintStream 可構建讀入器和寫出器, 而 System.out 不是讀入器和 寫出器;
- A2)為了與已有代碼兼容,System.in, System.out, System.err仍舊是流而不是讀入器或寫出器;
【2】如何讀入文本輸入
2.1)以二進制格式寫出數據, 用 DataOutputStream;
2.2) 以文本格式寫出數據, 用 PrintWriter;
2.3)處理文本輸入的方式可以通過 BufferedReader類, 它擁有一個 readLine 方法,使得我們可以讀入一行文本;
- 2.3.1)將 帶緩沖區的讀入器和輸入源組合起來:
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(“a.txt”), “UTF-8”));
2.4)然而 , BufferedReader 沒有任何用于讀入數字的方法, 建議使用 Scanner 來讀入文本輸入;
【3】以文本格式存儲對象
3.1)看個荔枝: 將一個 Employee 數組存儲為一個文本文件, 其中每條記錄都保存成單獨的一行, 字段間用分隔符隔開(如,豎線 | , 或冒號 : 作為分隔符);
(https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter1/TextFileTest.java)
【4】字符集
4.1)在 java SE 1.4中引入的 java.nio 包用到了 Charset 類統一了對字符集的轉換(注意,s是小寫的);
4.2)字符集建立了兩字節 Unicode碼元序列與使用本地字符編碼方式的字節序列間的映射;
- 4.2.1)ISO-8859-1: 是最流行的字符編碼方式之一, 這是一種對 Unicode前 256個字符進行單字節編碼的方式;
- 4.2.2)aliases方法: 它可以返回由別名構成的 Set對象:
- 4.2.3)字符集的大小寫是不敏感的;
- 4.2.4)調用靜態的 forName 方法:獲得一個 Charset, 只需要傳遞一個官方名字或別名;
- 4.2.5)靜態方法 availableCharsets: 確定在某個特定實現中哪些字符集是可用的:
(https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter1/CharsetTest.java)
4.3)本地編碼方式模式不能表示所有的Unicode字符,如果某個字符不能表示, 它將被轉換為 ?;(干貨——為什么出現 ? 的原因)
- 4.3.1)編碼字符串:一旦有了字符集,就可以使用它在包含Unicode碼元的 java 字符串 和 編碼而成的字節序列間進行轉換, 下面是如何編碼java 字符串的代碼的:
- 4.3.2)解碼字符串: 需要字節緩沖區。使用 ByteBuffer數組的靜態方法wrap 可以將一個字節數組轉換為一個字節緩沖區。 decode 方法的結果是 CharBuffer, 調用它的 toString() 方法將獲得一個字符串;
總結
以上是生活随笔為你收集整理的java流与文件——文本输入输出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 域名怎么选择利于优化(域名怎么选择利于优
- 下一篇: 域名注册了怎么使用(域名注册了怎么使用不