?? day14.txt
字號:
I/O流
對象流:ObjectInputStream和ObjectOutputStream
對象流是過濾流,需要節點流作參數來構造對象,用于直接把對象寫入文件和從文件中讀取對象。
只有實現了Serializable接口的類型的對象才可以被讀寫,Serializable接口是個標記接口,其中沒有定義方法。
對象會序列化成一個二進制代碼。
writeObject(o)、readObject()這兩個是對象讀寫操作時用的方法。
Object o = new Object();
FileOutputStream fos=new FileOutputStream("Object.txt");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(o);
oos.close();
FileInputStream fis =new FileInputStream("Object.txt");
ObjectInputStream ois =new ObjectInputStream(fis);
Object o = (Object)ois.readObject();
ois.close();
transient只能用來修飾屬性。表示這個屬性在對象序列化時將被忽略。
transient int num;
表示當我們進行序列化時忽略這個屬性。
注意:
對于對象流的操作,在寫對象時要一次寫入完畢,如果使用追加模式寫入,只會讀取到上一次寫入的對象。使用對象流寫入時,會先寫入一個頭部,然后寫入數據,最后加上結束符號,如果使用追加方式寫入的話,那就會在結束符號繼續向下寫入,但是在讀取時只會讀到結束符為止,以后再次寫入的數據就會丟失。
包名、類名和屬性可以被序列化,方法和構造器不會被序列化的。
靜態屬性不會被序列化的。
屬性會被遞歸序列化的,也就是一個類中有引用類型的屬性,如果這個屬性對應的類實現了Serializable接口,在對象序列化時,也同樣會對這個類中的屬性進行對象序列化,如果沒有實現Serializable接口,則會拋出異常。
所有屬性必須都是可序列化的,特別是當有些屬性本身也是對象的時候,要尤其注意這一點。
網絡中傳遞對象必須實現序列化。
nio無阻塞的I/O(優化的I/O)
java.nio 定義塊
Buffer類:一種用于特定的基本類型數據的容器
緩沖:就是塊,用來存儲內容。
容量:內存開辟的大小,根據類型的不同,有不同的空間。
界限:可用部分,即不應讀取或寫入的第一個元素的索引。
位置:當前指針的位置,從0開始。
容量>=界限>=位置
相關方法:
int capacity()
返回此緩沖區的容量。
int limit()
返回此緩沖區的界限。
int position()
返回此緩沖區的位置。
Buffer flip()
相當于截斷沒有用的空間,然后把指針移向開頭,使limit=position,position=0
Buffer position(int newPosition)
設置此緩沖區的位置。
當有大的文件需要處理的時候,為了不影響性能建議用直接緩沖。
Buffer有直接緩沖和間接緩沖兩種。
只有ByteBuffer類提供了直接緩沖。使用直接緩沖,不影響程序。其它類想用直接緩沖需要進行轉換。
java.nio.channels 對塊進行讀寫的通道,類似于以前的流
Channel接口:用于 I/O 操作的連接
編程步驟:
a. 先創建一個I/O流,
b. 使用I/O流.getChannel()方法,獲得通道,
c. 創建大小合適的ByteBUffer,
d. 通道的對象.read(buffer)/write(buffer)進行讀寫,
e. 關閉所有的流和通道,
f. 如果有多線程并發,可以使用"通道.lock()"獲得FileLock對象,用FileLock.release() 釋放此鎖定。
g. 當遇到編碼問題,使用CharSet、CharsetDecoder、CharsetEncoder三個類去解決
注意:
在讀之前需要調用一下clear()方法,幫助讀操作清理緩沖;寫之前需要調用flip()方法,幫助寫操作清理緩沖。
java.nio.charset 字符集,進行編碼解碼
Charset類:編碼類,編碼的信息
forName(String charsetName)
生成一個CharSet實例。
decode(ByteBuffer bb)
將此 charset 中的字節解碼成 Unicode 字符的便捷方法。
encode(CharBuffer cb)
將此 charset 中的 Unicode 字符編碼成字節的便捷方法。
CharsetDecoder類:解碼器
能夠把特定 charset 中的字節序列轉換成 16 位 Unicode 字符序列的引擎。
CharsetEncoder類:編碼器,編碼的行為
能夠把 16 位 Unicode 字符序列轉換成特定 charset 中字節序列的引擎。
網絡編程:
網絡基礎知識
Mac地址:每個網卡專用地址,也是唯一的。
端口(port):應用程序(進程)的標識(網絡通信程序)
OS中可以有65536(2^16)個端口,進程通過端口交換數據。
端口是一種抽象的軟件結構,與協議相關:TCP的23端口和UDT的23端口為兩個不同的概念。
端口應該用1024以上的端口,以下的端口都已經設定功能。
協議:為了進行網絡中的數據交換而建立的約定,協議是為了保證通信的安全,不同層的協議是完全不同的。
TCP協議:傳輸層的協議,重發一切錯誤的信息
IP協議:保證地址和主機一一對應(ip地址+網卡地址)
TCP編程:
TCP是一種面向連接的保證可靠傳輸的協議。通過TCP協議傳輸,得到的是一個順序的無差錯的數據流。發送方和接收方的成對的兩個socket之間必須建立連接,以便在TCP協議的基礎上進行通信,當一個socket(通常都是server socket)等待建立連接時,另一個socket可以要求進行連接,一旦這兩個socket連接起來,它們就可以進行雙向數據傳輸,雙方都可以進行發送或接收操作。
1) 服務器分配一個端口號,服務器使用accept()方法等待客戶端的信號,信號一到打開socket連接,從socket中取得OutputStream和InputStream。
2) 客戶端提供主機地址和端口號使用socket端口建立連接,得到OutputStream和InputStream。
Server端編碼的步驟:
1、new ServerSocket 打開端口
2、調ServerSocket的accept()等待客戶連接,當連接成功返回交互的Socket。
3、調用Socket.getInputStream,getOutputStream獲得服務器端的IO流
4、用處理流封裝后與客戶端交互,記住你讀我寫,一讀一寫。
5、關閉單一客戶端調用Socket的close(),關閉服務器調ServerSocket的close();
Socket端編碼步驟:
1、new Socket(Server ip,Server port)試圖連接,如成功才有對象
2、調用Socket.getInputStream,getOutputStream獲得服務器端的IO流
3、用處理流封裝后與客戶端交互,記住你讀我寫,一讀一寫。
4、關閉,只有Socket的close()方法。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -