1. 程式人生 > >Java基礎總結--IO總結2

Java基礎總結--IO總結2

tao 所在 處理方式 ide 不存在 rar ansi windows系統 自動

1.鍵盤錄入--Java具有特定的對象封裝這些輸入輸出設備
在System類定義 in-InputStream類型和out-PrintStream類型成員變量
阻塞是方法:read()無數據就阻塞
windows裏面回車鍵對於兩個字節\r-13\n-10
從系統獲得流對象只有一個,所以別關流
InputStream in = System.in(調用的是系統的流,在Java中被定義為該中類型)
不要進行關閉,因為關閉的是系統的流否則會用不了。
StingBulider/StringBuffer清空用的是delete()
鍵盤錄入的結束通常都是自定義結束的

2.轉換流(字節流與字符流之間的轉化)
字節流想利用字符緩沖流的readLine()--先轉化為字符流,在被緩沖流裝飾
InputStreamReader和OutputStreamReader繼承Reader
InputStreamReader(InputStream in)--字節流轉化為字符流可以指定charset編碼
對於字節與字符流的區別:字節對於一個中文需要讀兩次,字符對於中文其實也是利用底層的字節流讀兩次再進行查表,返回一個中文字符。
字符流 = 字節流 + 編碼表(未指定按照操作系統默認的碼表)
編碼:文字轉化為數字encode
解碼:數字轉化為文字decode
流的傳送:源A地--小管道--大管道--大管道--小管道--目的B地
轉化流:可以指定編碼表(未指定就用本機默認和其子類相同)
中文GBK-2B/UTF-8(國際標準-按照實際長度定字節數-每字節存在編碼頭)
指定用UTF-8寫就要用UTF-8讀
* 什麽時候使用轉化流:
源或目是字節流操作是文本數據,可以使用轉化流,提高對 文本的操作
一旦文本操作涉及具體的編碼表時候,必須使用轉化流

3.流操作的基本規律---流只能對傳送的數據進行操作
* 明確源地和目地
* 明確數據是否是純文本數據--確定使用的具體體系
是:字符流
否:字節流
* 明確具體的設備
源設備:
硬盤--文件
鍵盤--System.in
內存--數組
網絡--Socket流
目設備:
硬盤--文件
控制臺--System.out
內存--數組
網絡--Socket流
* 是否需要提高額外功能
需要高效(緩沖區)
是否需要轉換流

4.File類--將存在/不存在的文件或文件夾封裝成對象
* 方便對文件或文件夾的屬性信息進行操作
* File類對象可以作為參數傳遞給流對象
* File類的常見方法
構造方法
File(File parent, String child) //1,2類似
File(String parent, String child)
File(String pathname)
字段
char separatorChar系統默認名稱分隔符\\
char pathSeparatorChar系統默認路徑分隔符
常見的方法
1.獲取:文件名,文件路徑,文件大小(不存在就0B),文件修改時間
註意文件路徑:相對路徑和絕對路徑(從根目錄開始)
2.創建與刪除(文件、文件夾)
boolean-創建createNewFile()不存在就創建,存在就不創建,與輸出來不同,每次 都是進行覆蓋/或者續寫 --只能操作的文件或目錄,不可以操作裏面的數據
刪除boolean-delete() windows刪除從裏往外刪除
創建單極或多級目錄(刪除多級目錄--只會刪除最裏面的一個目錄)
文件正在被訪問不能刪除
3.判斷
先文件是否存在(是否目錄/是否文件-針對存在)是否隱藏
4.重命名renameTo(File dest) 重命名文件
5.獲取指定的當前目錄下的文件及文件夾名稱 String[]-list()
(包含隱藏的文件夾)
註意:封裝File對象的時候必須是目錄,不能是文件名
如果目錄存在,會返回一個長度為0的數組
6.文件過濾器(重點)
list(FilenameFilter filter)-String[]
FilenameFilter--文件過濾器(接口)定義類--實現FilenameFilter接口
將該類的對象傳遞給List()方法
過濾器方法原理:先遍歷目錄,放在數組中並遍歷,滿足條件放在容器裏面,
把集合轉化為數組返回
7.深度變量文件夾--對指定目錄的所有目錄的列出[遞歸]
8.遞歸
* 一定要明確遞歸的條件,否則容易棧溢出
5.Map接口的子類Properties--可以和IO技術結合--Map集合的屬性集
特點:集合中鍵和值都是字符串類型
集合中的數據可以保存在流中,或者從流中獲取
作用:通常該集合用於操作以鍵值對形式存在的配置文件
配置文件:存儲配置信息的文件,用於配置某些應用程序<鍵值對,xml,數據庫>
遍歷集合中元素:Set<String> stringPropertyNames()--變成集合,再叠代器
Properties與流的結合
list(PrintStream out)--直接將集合信息打印在控制臺
store(OutputStream out, String comments)--將集合信息存儲硬盤--這就叫持久化
兩個參數,前面指定寫的位置,後面字符串對數據進行描述--不要寫中文註釋
修改硬盤上存儲的鍵值對信息
先讀文件(保證裏面是鍵值對)--放到集合--修改--存儲
load(InputStream inStream) 讀數據
java裏面配置信息文件命名XX.properties/ini(windows系統)/xml文件
eg:記錄程序使用的次數---使用Properties--僅僅是Properties一個使用方面
配置信息--通常用在保存應用程序的個性化設置(保存設置後關掉依然存在)
註意:遞歸過程保證容器唯一,不要將容器定義在方法裏面,要傳參數容器
定義方法的時候需要確定傳入的參數--針對誰進行的處理

6.其他的流對象--輔助功能
打印流(不跑出異常):PrintStream--System.out返回值
構造方法:接收File,字符串路徑,流out對象
常見方法:提供操作各種數據的打印方法。print方法保存數據的表示形式
print(97)--文件裏面就是97,write(97)--會選擇最低的1B存儲不會保留形式
實現原理:將數字變成字符串然後寫字符串
PrintWriter--使用平臺默認編碼方式
構造方法:接收File,字符串路徑,流out對象,寫字符流

序列流:SequenceInputStream--對於多個流的合並--只有處理源的對象
輸入流的邏輯串聯--把多條流封裝為一條流(SequenceInputStream)
本質就是集合中裝入多個流--最後一個流返回值當作是結束
將多個源合並成一個源
eg:文件切割(按照順序切割)+文件合並
註意切割文件時候將文件類型和文件的個數存在一個配置文件裏面,因為合並
的時候需要用到這些信息

對象流:ObjectInputStream/OutputStream--為了能夠保存對象數據的關聯性
存儲的對象--在硬盤的文件裏面(對象的持久化存儲)對象流+文件流的配合使用
對象流的前提:要操作的對象必須實現serializable(標記接口)將對象轉化為二進制數字流--對象要按照順序存儲在文件中--writeObject(Object obj)、readObject()
註意:*存儲對象僅僅只是想延長對象的生命周期,所以並不關心寫出去的格式。
*讀對象所在文件時候必須使用基本流+對象流才能將數據轉化為一個對象
*讀對象的時候必須保證有該對象的類文件在內存在+寫出去的文件--兩個存在 才可以成功讀對象--強制轉型
*寫對象--序列化;讀對象--反序列化(類似於編碼和解碼)
*關於存儲對象--存儲的是對象的非靜態成員變量(被transient修飾的也不會 寫到對象文件裏面--其他並無差別--非靜態數據不想被序列化)
serializable(標記接口)存在的意義?--給類加ID
存儲對象--序列化的時候得到一個序列化id號(對應的類也有相同的id號),再進行讀對象的反序列化的過程中,會檢測加載的類與原來的類的對象id是否一致,不一致就會發生異常,就不能讀對象
不同版本的編譯器可能編譯的id結果不一致,解決辦法自己定義對象序列化id號
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;


RandomAccessFile--隨機訪問文件--不屬於任何io的繼承體系--字節流
特點
* 自身具備對隨機訪問文件的讀寫功能
* 該對象內部維護了一個byte數組,並通過指針可以操作數組中的元素--數組可以延長--自動擴展
* 可以設置和獲取當前指針的位置
* 其實該對象將字節輸入流和字節輸出流的封裝--為一個整體的工具對象
* 操作隨機文件---只能是文件(源/目的)
* 構造方法的特殊之處--指定操作文件的模式(讀寫的控制四種可選)
* 該類裏面有許多有用的方法讀寫基本數據類型(保證原本的字節數),字節數組等
* 如果文件不存在則創建,存在則不創建-不會覆蓋
* 可以指定存儲和寫的位置,隨機的對文件操作seek(long pos)--設置當前指針位置
沒有指定的情況下是從0角標開始寫(若原來存在則覆蓋)
* 隨機寫--可以給任意位置寫,可以從任意位置開始讀
* 隨機訪問文件要求數據要有規律,長度可以進行規律的估計
* 小應用:利用多個線程負責不同地方的數據寫數據(利用該類可以指定開始寫位置)

PipedInputStream/PipedOutputStream-管道流[應用於多線程]
特點
* 輸入流與輸出流可以直接連接 read()<-->write()
* 管道流讀必須要讀管道流的輸出
read()[阻塞方法沒管道輸出數據,就一直等待]-->write()[後面就執行不到]
程序就等待在這--一般用多線程可以處理該問題,寫線程寫出數據喚醒讀線程
* 管道流內部含有一個緩沖區
* 需要調用connect()方法連接兩個流

DataInputStream/DataOutputStream---操作基本數據類型
特點--保存基本數據類型的形態
* 使用結合+InputStream--讀和寫的類型必須一致
* writeUTF()--readUFT()對於使用(編碼和解碼是utf8修改版)自動添加的頭信息

操作數組的流對象--[源與目都是內存上]
ByteArrayInputStream/ByteArrayOutputStream--用流的思想操作數組
特點
* 內存中存在可變長度的數組緩沖數據
* 不用關閉流(關閉流原因:調用底層的資源)--操作的內存不用底層的資源


* 不會拋出io異常
* ByteArrayInputStream(byte[] buf)--明確源內存
ByteArrayOutputStream()--自動包含數組--也可以指定緩沖區的大小
* 如果要操作的源是內存--直接就用ByteArrayInputStream
CharArrayReader/CharArrayWriter
StringReader/StringReader

7.常見的編碼表
ASCII-可以是7bit字符
GBK--中文編碼
unicode--統一處理方式固定長度編碼--2B
utf-8--不固定長度的編碼,最多可以用三個字節表示一個字符

Java基礎總結--IO總結2