Java 筆記10
classObjectOutputStream也是過濾流,使節點流直接獲得輸出對象。
最有用的方法:WriteObject(Object b)
用流傳輸對象稱為對象的序列化,但並不使所有的對象都可以進行序列化的。隻有在實現類時必須實現一個接口:IO包下的Serializable(可序列化的)。此接口沒有任何的方法,這樣的接口稱為標記接口。
Class Studentimplements Serializable
把對象通過流序列化到某一個持久性介質稱為對象的可持久化。
Hibernate就是研究對象的可持久化。
ObuectInputStream in =new ObjectInputStream;
Objecto1=in.readObuect();
Students1=(Student)o1;
注意:因為o1是一個對象,因為需要對其進行保存。
Transient用來修飾屬性。
Transient int num;
表示當我們對屬性序列化時忽略這個屬性(即忽略不使之持久化)。
所有屬性必須都是可序列化的,特別是當有些屬性本身也是對象的時候,要尤其注意這一點。
判斷是否一個屬性或對象可序列化:Serialver。
Serialver TestObject(TestObject必須為已經編譯)
執行結果:如果不可序列化;則出現不可序列化的提示。如果可以序列化,那麼就會出現序列化的ID:UID。
java.until.*有
StringTokenizer(參數1,參數2)按某種符號隔開文件
StringTokenizer(s,”:”)用“:”隔開字符,s為對象。
練習:將一個類序列化到文件,然後讀出。下午:
1、 網絡基礎知識
2、 JAVA網絡編程
網絡與分布式集群係統的區別:每個節點都是一台計算機,而不是各種計算機內部的功能設備。
Ip:具有全球唯一性,相對於internet,IP為邏輯地址。
端口(port):一台PC中可以有65536個端口,進程通過端口交換數據。連線的時候需要輸入IP也需要輸入端口信息。
計算機通信實際上的主機之間的進程通信,進程的通信就需要在端口進行聯係。
192.168.0.23:21
協議:為了進行網絡中的數據交換(通信)而建立的規則、標準或約定。
不同層的協議是不同的。
網絡層:尋址、路由(指如何到達地址的過程)
傳輸層:端口連接
TCP模型:應用層/傳輸層/網絡層/網絡接口
端口是一種抽象的軟件結構,與協議相關:TCP23端口和UDT23端口為兩個不同的概念。
端口應該用1024以上的端口,以下的端口都已經設定功能。
套接字(socket)的引入:
Ip+Port=Socket(這是個對象的概念。)
Socket為傳輸層概念,而JSP是對應用層編程。例:
java.net.*;
(Server端定義順序)
ServerSocket(intport)
Socket.accept();//阻塞方法,當客戶端發出請求是就恢複
如果客戶端收到請求:
則Socket SI=ss.accept();
注意客戶端和服務器的Socket為兩個不同的socket。
Socket的兩個方法:
getInputStream():客戶端用
getOutputStream() 服務器端用
使用完畢後切記Socket.close(),兩個Socket都關,而且不用關內部的流。
在client端,Sockets=new Socket(“127.0.0.1”,8000);
127.0.0.1為一個默認本機的地址。
練習:
1、 客戶端向服務器發出一個字符串,服務器轉換成大寫傳回客戶端。
大寫的函數:String.toUpperCase()
服務器告訴客戶端:“自開機以來你是第n 個用戶”。pan st�b'o�o����12.0pt;font-family:宋體;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:"Times New Roman"'>定位。Mode(“r”:隨機讀;”w”:隨機寫;”rw”:隨機讀寫)
練習:寫一個類A,JAVAA file1 file2
file1要求是係統中已經存在的文件。File2是還沒有存在的文件。
執行完這個命令,那麼file2就是file1中的內容。
字符流:reader\write隻能輸純文本文件。
FileReader類:字符文件的輸出
字節流與字符流的區別:
字節流的字符編碼:
字符編碼把字符轉換成數字存儲到計算機中,按ASCii將字母映射為整數。
把數字從計算機轉換成相應的字符的過程稱為解碼。
編碼方式的分類:
ASCII(數字、英文):1個字符占一個字節(所有的編碼集都兼容ASCII)
ISO8859-1(歐洲):1個字符占一個字節
GB-2312/GBK:1個字符占兩個字節
Unicode: 1個字符占兩個字節(網絡傳輸速度慢)
UTF-8:變長字節,對於英文一個字節,對於漢字兩個或三個字節。
原則:保證編解碼方式的統一,才能不至於出現錯誤。
Io包的InputStreamread稱為從字節流到字符流的橋轉換類。這個類可以設定字符轉換方式。
OutputStreamred:字符到字節
Bufferread有readline()使得字符輸入更加方便。
在I/O流中,所有輸入方法都是阻塞方法。
Bufferwrite給輸出字符加緩衝,因為它的方法很少,所以使用父類printwrite,它可以使用字節流對象,而且方法很多。
練習:做一個記事本
swing/JfileChoose:getSelect file()
InputStreeamReader:把字節變為字符
JAVA中對字符串長無限製 bufferedReader(ir)
()
釋放鎖標記隻有在Synchronized代碼結束或者調用wait()。
注意鎖標記是自己不會自動釋放,必須有通知。
注意在程序中判定一個條件是否成立時要注意使用WHILE要比使用IF要嚴密。
WHILE會放置程序饒過判斷條件而造成越界。
補充知識:
suspend()是將一個運行時狀態進入阻塞狀態(注意不釋放鎖標記)。恢複狀態的時候用resume()。Stop()指釋放全部。
這幾個方法上都有Deprecated標誌,說明這個方法不推薦使用。
一般來說,主方法main()結束的時候線程結束,可是也可能出現需要中斷線程的情況。對於多線程一般每個線程都是一個循環,如果中斷線程我們必須想辦法使其退出。
如果主方法main()想結束阻塞中的線程(比如sleep或wait)
那麼我們可以從其他進程對線程對象調用interrupt()。用於對阻塞(或鎖池)會拋出例外InterruptedException。
這個例外會使線程中斷並執行catch中代碼。
多線程中的重點:實現多線程的兩種方式,Synchronized,以及生產者和消費者問題(ProducerConsumer.java文件)。
練習:
① 存車位的停開車的次序輸出問題;
② 寫兩個線程,一個線程打印1-52,另一個線程答應字母A-Z。打印順序為12A34B56C……5152Z。通過使用線程之間的通信協調關係。
注:分別給兩個對象構造一個對象o,數字每打印兩個或字母每打印一個就執行o.wait()。在o.wait()之前不要忘了寫o.notify()。
補充說明:通過Synchronized,可知Vector較ArrayList方法的區別就是Vector所有的方法都有Synchronized。所以Vector更為安全。
同樣:Hashtable較HashMap也是如此。最後更新:2017-04-02 16:47:44