閱讀112 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go 為什麼Java中的HashMap<K, V>的get函數是get(Object key),而不是get(K key)?
  下一篇:go Android六大優勢