主題一 I/O操做php
» 流的概念html
在面嚮對象語言中, 數據的輸入和輸出都是經過數據流來實現的。數據流是一組有順序、有起點和終點的字符集合。就比如是兩個不一樣的池子,一個池子中存滿了水,而另外一個池子中則沒有任何的東西,在這兩個水池中安放一個管子,水就能夠從一個池子流向另外一個池子了。在從一個池子向另外一個池子輸送水的過程當中,水扮演的角色就是數據流。java
[請點擊查看更多內容 轉自文章]linux
» Stream程序員
stream表明的是任何有能力產出數據的數據源,或是任何有能力接收數據的接收源。在Java的IO中,全部的stream(包括Inputstream和Outputstream)都包括兩種類型:spring
[請點擊查看更多內容 轉自博客]編程
» 輸入輸出流windows
能夠讀取字節的類就被稱爲輸入流,並且全部的輸入流都繼承自抽象類InputStream。一個可以將字節流傳送出去的類被稱爲輸出流,全部的輸出流都繼承自抽象類OutputStream。輸入流和輸出流能夠分爲字節流類和字符流類。數組
字節流類包括InputStream和OutputStream兩個抽象類。其中包含了字節輸入和輸出全部的方法。真正用來作數據輸入和輸出處理的是這兩個抽象類的各個具體的子類,這些子類能夠根據不一樣的輸入和輸出進行處理。服務器
字符流包括Reader和Writer兩個抽象類。這些抽象類處理的是Unicode字符流。用來作數據處理的是Reader和Writer的子類。這些子類會根據不一樣的輸入和輸出進行處理。
[請點擊查看更多內容 轉自文章]
» 字節流和字符流的區別
Reader和Writer要解決的,最主要的問題就是國際化。原先的I/O類庫只支持8位的字節流,所以不可能很好地處理16位的Unicode字符流。Unicode是國際化的字符集(更況且Java內置的char就是16位的Unicode字符),這樣加了Reader和Writer以後,全部的I/O就都支持Unicode了。此外新類庫的性能也比舊的好。可是,Read和Write並非取代InputStream和OutputStream,有時,你還必須同時使用"基於byte的類"和"基於字符的類"。爲此,它還提供了兩個"適配器(adapter)"類。InputStreamReader負責將InputStream轉化成Reader,而OutputStreamWriter則將OutputStream轉化成Writer。
[請點擊查看更多內容 轉自博客]
» Inputstream類和Outputstream類
inputstream類和outputstream類都爲抽象類,不能建立對象,能夠經過子類來實例化。
[請點擊查看更多內容 轉自沒有蓋的盒子的博客]
» 字節輸入輸出流
InputStream 是字節輸入流,也是全部字節輸入流的超類,在它的派生類中必需要從新定義字節輸入流中所聲明的抽象方法。其中有一些方法,如read()方法,是從輸入流中來讀取一個字節的內容,而且返回類型是整型。
字節輸出流OutputStream是全部字節輸出流的超類,它是一個抽象類。它的派生類必須從新定義OutputStream中定義的抽象方法。
[請點擊查看更多內容 轉自博客]
» 字節文件輸入、輸出流
文件字節輸入輸出流是FileInputStream和FileOutputStream,這是InputStream和OutputStream的子類。使用這兩個類就能夠從一個指定的文件中讀取或者向某一個文件中寫入數據。
[請點擊查看更多內容 轉自人人網王曉曄的日誌]
» 字節緩衝輸入、輸出流
使用所使用的字節輸入流和字節輸出流是以字節爲單位進行讀寫操做的,這樣一來,就使文件流的效率變的很是低。這時須要使用緩衝輸入流(BufferedInputStream)和緩衝輸出流(BufferedOutputStream),當輸入數據時,將數據存放到一個緩衝區中,當須要對數據進行讀寫時,就直接去訪問緩衝區。當輸出數據時,數據不會直接向輸出流輸出,而是先將數據寫入緩衝區,當緩衝區中的數據滿時,纔會將緩衝區中的數據寫入輸出流中,這樣一來就大大提升了輸入和輸出操做的效率。
[請點擊查看更多內容 轉自shazhuzhu1的ITeye博客]
» 字節數據輸入、輸出流
在流操做中,還有專門針對於java基本數據類型的寫入和讀取的操做,分別是字節數據輸入流java.io.DataInputStream和字節數據輸出流java.io.DataOutputStream,使用字節數據流進行基本的寫入和讀取操做時,能夠沒必要擔憂不一樣平臺之間數據大小差別的問題,由於java的數據類型佔用空間的大小都是有規定的。
[請點擊查看更多內容 轉自博客]
» 字節對象輸入、輸出流
字節對象輸入、輸出流也就是對象序列化,對象序列化就是指將繼承了serializable接口的類的實例轉化成一個字節序列,而且能夠將其存儲在永久性存儲介質中。在須要的時候能夠將其從存儲介質中取出並還原成具體的實例來進行使用。Java提供了字節對象輸入流java.io.ObjectInputStream和字節對象輸出流java.io.ObjectOutputStream來實現這樣的操做。類java.io.PrintStream是很是重要的輸出流類。表示標準輸出並用來在控制檯窗口中輸出信息的System.out是java.io.PrintStream類型的變量。類java.io.PrintStream具備很是良好的特性:
[請點擊查看更多內容 轉自博客]
» 文件類
在輸入輸出處理中,對於文件的讀寫,須要使用到java.io包中有關於文件處理的類,其中包括有File、FileInputStream、FileOutputStream、RandomAccessFile和FileDescriptor;接口有FilenameFilter.
[請點擊查看更多內容 轉自文章]
» File 類
學習如何讀取和寫入數據以前,首先須要瞭解一個文件操做的工具類File,使用該類便可以處理數據文件也能夠處理目錄,而且經過該類能夠列出File實例所表明的目錄下全部的文件名。在處理一個目錄以前,首先要作的是建立一個file的實例用於表示該目錄,語法以下。
File file = new File(「src」);
在不一樣的操做系統中的路徑名稱的表示也是不一樣的,如在windows中,路徑名爲「c:\Program File\Java」,而在linux中的路徑就是「/home/Program File/Java」。這是由於windows中使用的是UNC路徑名,以「\\」開始的目錄表示上下文環境所在的目錄的硬盤根目錄,若是沒有「\\」做爲路徑的開始,則表示相對於當前工做目錄的路徑,而且經過「盤符(C/D/E….):」形式表示硬盤指定。然而在Linux中,並無硬盤驅動器的概念,因此它的路徑指定必須以「/」來表示根目錄開始的絕對路徑,其餘的則是相對路徑。
[請點擊查看更多內容 轉自博客筆記]
» 字符流
字符輸入輸出流是Reader和Writer,Reader類是字符輸入流的基類,其中包括有FileReader、BufferedReader等子類。Writer是字符輸出流的基類。只用Reader和Writer對流數據的操做是以一個字符的長度爲單位進行處理的,也能夠進行字符的編碼處理。
[請點擊查看更多內容 轉自文章]
» 字符讀、寫流
字符流支持Unicode標準字符集,若是進行文本讀寫,一般在使用Reader和Writer的子類時要從新定義相關的方法。而Reader和Writer只提供了用於字符流處理的接口,而不能生成實例,只能夠經過他們的子類對象來處理字符流。
Reader是Java語言中字符輸入流全部類的父類,該類是抽象類,不能被實例化。
Writer是Java語言中字符輸出流全部類的父類,該類是抽象類,不能被實例化。
可使用Reader和Writer的子類InputStreamReader和OutputStreamWriter來進行字符的處理,也就是以字符爲基本單位進行讀寫操做,而且能夠實現字符流和字節流之間的轉化字符流操做比字節流操做效率要高。
使用InputStream和OutputStream對象爲構造方法的參數建立InputStreamReader和OutputStreamWriter變量能夠直接讀取文本,而不須要本身再判斷字符編碼。
[請點擊查看更多內容 轉自博客]
» 文件讀、寫字符流
文件讀寫字符流是FileReader和FileWriter,它們分別繼承自InputStreamReader與OutputStreamWriter,並且使用文件輸入輸出流能夠直接指定文件名或者使用File來打開指定的文件。若是須要指定編碼的話,就須要使用InputStreamReader和OutputStreamWriter。
Filereader中有兩種形式的經常使用構造方法以下:
FileWriter中有四種形式的經常使用構造方法以下:
[請點擊查看更多內容 轉自博客]
» 字符緩衝讀、寫流
字符緩衝讀寫流是BufferedReader和BufferedWriter,它們的默認緩衝區爲8192個字符。和字節緩衝讀寫流相似,讀取文件時,須要首先將文件讀取到緩衝區,而後使用read()方法從緩衝區讀取,若是緩衝區的數據不足,就會再次從文件中讀取字符到緩衝區。同理BufferedWriter寫入數據時,不會直接將數據寫入到目的地,而是寫入到緩衝區中。
BufferedReader類中有以下兩個構造方法,並支持mark()和reset()方法:
BufferedWriter類中有以下兩個構造方法:
[請點擊查看更多內容 轉自博客]
主題二 多線程
» 線程的概念
線程是實現併發的一種有效的手段,多線程是現當代操做系統開發的發展方向。這就比如一我的在手忙腳亂的時候,總但願再分身出一個本身,或者是巴不得多長出一隻手來,那多出來的「分身」或者是但願多長出來的手就至關於線程,也就是多線程。
[請點擊查看更多內容 轉自百度百科]
» 進程的概念
進程就是一個執行的程序任務,多進程的多任務處理特色就是容許計算機同時處理兩個或兩個以上的程序。線程則是比進程要小的單位,由前面介紹的進程來管理。一個多線程的程序要比多進程的程序須要更少的管理資源。
[請點擊查看更多內容 轉自百度百科]
» 線程與進程的關係
[請點擊查看更多內容 轉自博客]
» 開啓多線程的優勢和缺點
提升界面程序響應速度。經過使用線程,能夠將須要大量時間完成的流程在後臺啓動單獨的線程完成,提升前臺界面的相應速度。
充分利用系統資源,提升效率。經過在一個程序內部同時執行多個流程,能夠充分利用CPU等系統資源,從而最大限度的發揮硬件的性能。
當程序中的線程數量比較多時,系統將花費大量的時間進行線程的切換,這反而會下降程序的執行效率。可是,相對於優點來講,劣勢仍是頗有限的,因此如今的項目開發中,多線程編程技術獲得了普遍的應用。
[請點擊查看更多內容 轉自文章]
» 線程的生命週期
線程是一個動態執行的過程,它也有一個從產生到死亡的過程,這就是所謂的生命週期。一個線程在它的生命週期內有5種狀態:
[請點擊查看更多內容 轉自博客]
» 進程和程序的區別和聯繫
[請點擊查看更多內容 轉自博客]
» 線程的優先級和調度
Java的每一個線程都有一個優先級,當有多個線程處於就緒狀態時,線程調度程序根據線程的優先級調度線程運行。
[請點擊查看更多內容 轉自博客]
» 線程狀態的轉變
一個線程在其生命週期中能夠從一種狀態改變到另外一種狀態
控制線程的啓動和結束:
當一個新建的線程調用它的start()方法後即進入就緒狀態,處於就緒狀態的線程被線程調度程序選中就能夠得到CPU時間,進入運行狀態,該線程就開始運行run()方法。
控制線程的結束稍微複雜一點。若是線程的run()方法是一個肯定次數的循環,則循環結束後,線程運行就結束了,線程對象即進入死亡狀態。若是run()方法是一個不肯定循環,早期的方法是調用線程對象的stop()方法,然而因爲該方法可能致使線程死鎖,所以從1.1版開始,不推薦使用該方法結束線程。通常是經過設置一個標誌變量,在程序中改變標誌變量的值實現結束線程。
線程阻塞條件:
處於運行狀態的線程除了能夠進入死亡狀態外,還可能進入就緒狀態和阻塞狀態。下面分別討論這兩種狀況:
處於運行狀態的線程若是調用了yield()方法,那麼它將放棄CPU時間,使當前正在運行的線程進入就緒狀態。
有多種緣由可以使當前運行的線程進入阻塞狀態,進入阻塞狀態的線程當相應的事件結束或條件知足時進入就緒狀態。使線程進入阻塞狀態可能有多種緣由:
線程調用了sleep()方法,線程進入睡眠狀態。
I/O阻塞。
有時要求當前線程的執行在另外一個線程執行結束後再繼續執行,這時能夠調用join()方法實現。
線程調用了wait()方法,等待某個條件變量,此時該線程進入阻塞狀態。直到被通知(調用了notify()或notifyAll()方法)結束等待後,線程回到就緒狀態。
另外若是線程不能得到對象鎖,也進入就緒狀態。
[請點擊查看更多內容 轉自博客]
» Java 建立線程的兩個方法
Java提供了線程類Thread來建立多線程的程序。其實,建立線程與建立普通的類的對象的操做是同樣的,而線程就是Thread類或其子類的實例對象。每一個Thread對象描述了一個單獨的線程。要產生一個線程,有兩種方法:
[請點擊查看更多內容 轉自博客]
» Thread 類的方法
currentThread() 返回當前運行的Thread對象。
start() 啓動一個線程。
run() 線程體,由start()方法調用,當run()方法返回時,當前的線程結束。
stop() 使調用它的線程當即中止執行。
sleep(int n)使線程睡眠n毫秒,n毫秒後,線程能夠再次運行。
suspend() 使線程掛起,暫停運行。
resume() 恢復掛起的線程,使其處於可運行狀態(Runnable)。
yield() 將CPU控制權主動移交到下一個可運行線程。
isAlive() 若是線程已被啓動而且未被終止,那麼isAlive()返回true。若是返回false,則該線程是新建立或是已被終止的。
[請點擊查看更多內容 轉自百度貼吧]
» sleep與yield的區別
[請點擊查看更多內容 轉自博客]
» 互斥鎖
在Java中,每一個對象都對應於一個能夠稱爲「互斥鎖」的標記,這個標記用來保證在任一時刻,只能有一個線程訪問該對象。就像使用旅館房間,若是房間沒有人住,你能夠住進去,同時鎖上門,這樣別人就不會進房間打擾你。一樣道理,若是資源如今沒有被使用,線程能夠獲得互斥鎖,從而獲得線程的使用權。當線程執行完畢後,它放棄互斥鎖,就像你離開房間,讓門開着等待下一位顧客。若是已經有一個線程已經取得互斥鎖,其他的線程就必須等待當前線程放棄互斥鎖,這就比如你到房門前時發現門已鎖住,你必須等待房間裏的人出來,打開門,你才能進入。
[請點擊查看更多內容 轉自博客]
» 線程同步的特色
[請點擊查看更多內容 轉自Java編程網]
» 線程的同步
同步是一種保證共享資源完整性的手段,具體做法是在表明原子操做的程序代碼前加上synchronized標記,這樣的代碼被稱爲同步代碼塊。
[請點擊查看更多內容 轉自百度百科]
» 線程通訊
不一樣的線程執行不一樣的任務,若是這些任務有某種聯繫,線程之間必須可以通訊,協調完成工做。例如生產者和消費者共同操做堆棧,當堆棧爲空時,消費者沒法取出產品,應該先通知生產者向堆棧中加入產品。當堆棧已滿時,生產者沒法繼續加入產品,應該先通知消費者從堆棧中取出產品。
java.lang.Object類中提供了兩個用於線程通訊的方法:
[請點擊查看更多內容 轉自博客]
主題三 網絡編程技術
» 網絡編程
網絡編程就是在兩個或兩個以上的設備(例如計算機)之間傳輸數據。程序員所做的事情就是把數據發送到指定的位置,或者接收到指定的數據,這個就是狹義的網絡編程範疇。在發送和接收數據時,大部分的程序設計語言都設計了專門的API實現這些功能,程序員只須要調用便可。
[請點擊查看更多內容 轉自博客]
» 網絡通信方式
在現有的網絡中,網絡通信的方式主要有兩種:
[請點擊查看更多內容 轉自文章]
» Socket
網絡上的兩個程序經過一個雙向的通信鏈接實現數據的交換,這個雙向鏈路的一端稱爲一個Socket。Socket一般用來實現客戶方和服務方的鏈接。Socket是TCP/IP協議的一個十分流行的編程界面,一個Socket由一個IP地址和一個端口號惟一肯定。
[請點擊查看更多內容 轉自百度百科]
» Socket通信的過程
Server端Listen(監聽)某個端口是否有鏈接請求,Client端向Server 端發出Connect(鏈接)請求,Server端向Client端發回Accept(接受)消息。一個鏈接就創建起來了。Server端和Client 端均可以經過Send,Write等方法與對方通訊。
對於一個功能齊全的Socket,都要包含如下基本結構,其工做過程包含如下四個基本的步驟:
[請點擊查看更多內容 轉自博客]
» ServerSocket
在服務器端使用的是ServerSocket,主要用於接收客戶端傳來的對象。
可使用下面的語句得到客戶端的請求:
Socket linksocket = myserver.accept();
得到鏈接後進行通訊,而後使用下面的語句關閉服務器監聽:
myserver.close();
[請點擊查看更多內容 轉自文章]
» DatagramPacket
在使用自尋址包以前,你須要首先熟悉DatagramPacket類,地址信息和自尋址包以字節數組的方式同時壓縮入這個類建立的對象中
DatagramPacket有數個構造函數,即便這些構造函數的形式不一樣,但一般狀況下他們都有兩個共同的參數:byte [] buffer 和 int length,buffer參數包含了一個對保存自尋址數據包信息的字節數組的引用,length表示字節數組的長度。
最簡單的構造函數是DatagramPacket(byte [] buffer, int length),這個構造函數肯定了自尋址數據包 數組和數組的長度,但沒有任何自尋址數據包的地址和端口信息,這些信息能夠後面經過調用方法setAddress(InetAddress addr)和 setPort(int port)添加上。
[請點擊查看更多內容 轉自博客]
» URL
URL(Uniform Resource Locator)即統一資源定位符,表示在internet上的某一個具體資源的訪問地址。
[請點擊查看更多內容 轉自百度百科]
» TCP網絡程序的工做原理
TCP 客戶端程序與TCP服務器程序的交互過程:
[請點擊查看更多內容 轉自博客]
» UDP
UDP(User Datagram Protocol) 用戶數據報協議,用戶數據報協議(UDP)是 OSI 參考模型中一種無鏈接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。 UDP 協議基本上是 IP 協議與上層協議的接口。 UDP 協議適用端口分別運行在同一臺設備上的多個應用程序。
UDP協議有以下的特色:
從以上特色可知,UDP提供的是無鏈接的、不可靠的數據傳送方式,是一種盡力而爲的數據交付服務。
[請點擊查看更多內容 轉自百度百科]
» DatagramSocket類
DatagramSocket自己只是碼頭,不維護狀態,不能產生IO流,它的惟一做用就是接收和發送數據報,Java使用DatagramPacket來表明數據報,DatagramSocket接收和發送的數據都是經過DatagramPacket對象完成的。
[請點擊查看更多內容 轉自百度空間]
» InetAddress類
InetAddress類在網絡API套接字編程中扮演了一個重要角色。參數傳遞給流套接字類和自尋址套接字類構造器或非構造器方法。InetAddress描述了32位或64位IP地址,要完成這個功能,InetAddress類主要依靠兩個支持類Inet4Address 和 Inet6Address,這三個類是繼承關係,InetAddrress是父類,Inet4Address 和 Inet6Address是子類。因爲InetAddress類只有一個構造函數,並且不能傳遞參數,因此不能直接建立InetAddress對象。
[請點擊查看更多內容 轉自博客]