2018年12月26日 星期三

Java SE 入門教學 - 圖形介面開發

更新時間:12/26/2018

前言

人是視覺動物(誤) 感性的物種,擁有獨自的喜好,看順眼與不順眼都很主觀,但唯一相同的是直覺性地操作工具,當接觸到未知的工具時,總是從看得見得開始摸索,並慢慢發覺隱藏在背後的功能,最後可以非常靈活使用工具。

程式設計師生產出來的產品也是一樣,如果一個系統只能使用文字介面操作,那它的使用對象一定是"工程師",一般使用者可不買單這種純文字的操作,操作一個功能還要查找要使用那個命令,這實在是太麻煩了!

圖形使用者介面(Graphical User Interface, GUI)是指採用圖形方式顯示的電腦操作用戶介面。與早期電腦使用的命令列介面相比,圖形介面對於使用者來說在視覺上更易於接受,以「各種美觀、而不單調的視覺訊息」提示使用者「狀態的改變」,勢必比純文字來得精彩。

2018年12月25日 星期二

Java SE 入門教學 - 執行緒(2)

更新時間:12/25/2018

前言

在前篇 執行緒(1) 初次介紹了執行緒,並提出執行緒的競速情況(Race Condition)。在此篇文章會介紹簡單、靈活地操作執行緒,至於更深入的控制執行緒的剖析,將不在此篇討論。

在執行緒中的"鎖"提供了兩種主要特性:互斥(mutual exclusion)和可見性(visibility)。

互斥即一次只允許一個執行緒持有某個特定的鎖,因此可使用該特性實作對共享數據的協調訪問協議,這樣,一次就只有一個執行緒能夠使用該共享數據。

可見性要更加複雜一些,它必須確保釋放鎖之前對共享數據做出更改,對於隨後獲得該鎖的另一個執行緒是可見的。如果沒有同步機制提供的這種可見性保證,執行緒看到的共享變數可能是修改前的值或不一致的值,這將引發許多嚴重問題。

2018年12月24日 星期一

Java SE 入門教學 - 執行緒(1)

更新時間:12/24/2018

前言

以前電腦的 CPU 只有單一實體核心,而現在電腦的 CPU 都是實體多顆核心,能夠讓作業系統同時處理許多程序(Process)與執行緒(Thread),使得應用程式充分利用 CPU 資源。此篇文章是 Java (多)執行緒的一個入門,其實 Java 裡頭的執行緒完全可以寫成一本書了!這邊就是如何在 Java 中簡單使用(多)執行緒,並介紹(多)執行緒產生的後遺症。

執行緒是作業系統能夠進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中一個單一順序的控制流,一個程序中可以並行多個執行緒,每條執行緒並列執行不同的任務。

為什麼使用執行緒?

在 Java 程序中使用執行緒有許多原因。如果您使用 Swing、servlet、RMI 或 Enterprise JavaBeans(EJB)技術,您也許沒有意識到您已經在使用執行緒了。使用執行緒的一些原因是它們可以幫助:

使 UI 響應更快

事件驅動的 UI 工具箱(如 AWT 和 Swing)有一個事件執行緒,它處理 UI 事件,如按下鍵盤或點擊滑鼠。 AWT 和 Swing 程序把事件偵聽器與 UI 物件連接。當特定事件(如單擊了某個按鈕)發生時,這些偵聽器會得到通知。事件偵聽器是在 AWT 事件執行緒中調用的。 如果事件偵聽器要執行持續很久的任務,如檢查一個大文檔中的拼寫,事件執行緒將忙於運行拼寫檢查器,所以在完成事件偵聽器之前,就不能處理額外的 UI 事件。這就會使程序看來似乎停滯了,讓用戶不知所措。 要避免使UI 延遲響應,事件偵聽器應該把較長的任務放到另一個執行緒中,這樣 AWT 執行緒在任務的執行過程中就可以繼續處理 UI 事件(包括取消正在執行的長時間運行任務的請求)。

利用多處理器(MultiProcessor, MP)系統

多處理器(MP)系統比過去更普及了。以前只能在大型數據中心和科學計算設施中才能找到它們。現在許多低端服務器系統,甚至是一些個人主機或行動裝置系統都有多個處理器。 現代操作系統,包括 Linux、Solaris 和 Windows Server/7/10,都可以利用多個處理器並調度執行緒在任何可用的處理器上執行。 調度的基本單位通常是執行緒;如果某個程序只有一個活動的執行緒,它一次只能在一個處理器上運行。如果某個程序有多個活動執行緒,那麼可以同時調度多個執行緒。在精心設計的程序中,使用多個執行緒可以提高程序吞吐量和性能。

簡化建模

在某些情況下,使用執行緒可以使程序編寫和維護起來更簡單。考慮一個仿真應用程序,您要在其中模擬多個實體之間的交互作用。給每個實體一個自己的執行緒可以使許多仿真和對應用程序的建模大大簡化。 另一個適合使用單獨執行緒來簡化程序的示例是在一個應用程序有多個獨立的事件驅動組件的時候。例如,一個應用程序可能有這樣一個組件,該組件在某個事件之後用秒數倒數計時,並更新螢幕顯示。與其讓一個主循環定期檢查時間並更新顯示,不如讓一個執行緒什麼也不做,一直休眠,直到某一段時間後,更新螢幕上的計數器,這樣更簡單,而且不容易出錯。這樣,主執行緒就根本無需擔心計時器。

執行異步(Asynchronous)或後台處理

服務器應用程序從遠程來源,如網路插座(Network socket, 網路埠)獲取輸入。當讀取 Network socket 時,如果當前沒有可用數據,那麼對 SocketInputStream.read() 的調用將會阻塞,直到有可用數據為止。 如果單執行緒程序要讀取 Network socket,而 Network socket 另一端的實體並未發送任何數據,那麼該程序只會永遠等待,而不執行其它處理。相反,程序可以輪詢 Network socket,查看是否有可用數據,但通常不會使用這種做法,因為會影響性能。 但是,如果您創建了一個執行緒來讀取 Network socket,那麼當這個執行緒等待 Network socket 中的輸入時,主執行緒就可以執行其它任務。您甚至可以創建多個執行緒,這樣就可以同時讀取多個 Network socket。這樣,當有可用數據時,您會迅速得到通知(因為正在等待的執行緒被喚醒),而不必經常輪詢以檢查是否有可用數據。使用執行緒等待 Network socket 的代碼也比輪詢更簡單、更不易出錯。

2018年12月19日 星期三

Java SE 入門教學 - 簡單操作資料庫 - 語法使用

更新時間:12/19/2018

前言

在建立前端即 Java 程序和後端(即資料庫)之間的連接之前,我們應該了解 JDBC 究竟是什麼以及它為何存在。

什麼是 JDBC?

JDBC 是 Java Database Connectivity 的首字母縮寫。這是 ODBC(開放式資料庫連接)的進步。JDBC 是為了將數據從前端移動到後端而開發的標準 API 規範。此 API 由用 Java 編寫的類別和介面組成。它基本上充當介面(不是我們在 Java 中使用的介面)或 Java 程序和資料庫之間的通道,即它在兩者之間建立鏈接,以便程序員可以從 Java 代碼發送數據並將其存儲在資料庫中以備將來使用。

為什麼 JDBC 會出現?

如前所述,JDBC 是 ODBC 的一個進步,ODBC 依賴於平台有很多缺點。ODBC API 是用 C、C++、Python、Core、Java 編寫的,正如我們所知,上面的語言(除了 Java 和 Python 的某些部分)都依賴於平台。因此,為了消除依賴性,JDBC 由資料庫供應商開發,該供應商由用 Java 編寫的類別和介面組成。

2018年12月13日 星期四

Java SE 入門教學 - 簡單操作資料庫 - 環境架設

更新時間:12/13/2018

前言

有些資料執行完畢就可以丟掉,但有些資料必須保存,以利下一次的使用,我們可以使用序列化與反序列化將資料儲存在硬碟中,但資料多後,程式碼需要控制流程,又要管理資料,這會變得很難維護。

在紙筆發明前,我們的老祖宗只能使用我們的大腦記住所有的資料同時又必須思考要做什麼事情。在紙筆發明後,我們可以將一些資訊寫下來,這樣我們的老祖宗可以專心思考要做什麼事情,甚至可以創作一些詩詞廣為流傳,例如《江城子》蘇軾


近代,在電腦發明前,我們可能使用"資料夾"的方式來保存世界上所有國家的資料。


在電腦發明後,我們可能使用這樣的工作表軟體紀錄資料。


使用這種工作表來儲存國家資料,當然比用卡片好多了,尤其是想要尋找某個國家的資料,然後修改它的人口數量。雖然方便多了,不過在你查詢國家資料時,可能會有這樣的問題:各表單間還是不能連貫,那跟一個一個檔案分開也沒啥區別了

2018年12月12日 星期三

安裝 MariaDB

更新時間:12/12/2018

前言

MariaDB 資料庫管理系統是 MySQL 的一個分支,主要由開源社群在維護,採用 GPL 授權授權。開發這個分支的原因之一是:Oracle 公司收購了 MySQL 後,有將 MySQL 閉源的潛在風險,因此社群採用分支的方式來避開這個風險。

MariaDB 的目的是完全相容 MySQL,包括 API 和命令列,使之能輕鬆成為 MySQL 的代替品。在儲存引擎方面,10.0.9 版起使用 XtraDB(名稱代號為Aria)來代替 MySQL 的 InnoDB。

MariaDB 由 MySQL 的創始人米卡埃爾·維德紐斯(Ulf Michael Widenius)主導開發,他早前曾以 10 億美元的價格,將自己建立的公司 MySQL AB 賣給了 SUN,此後,隨著 SUN 被甲骨文收購,MySQL 的所有權也落入 Oracle 的手中。MariaDB 名稱來自米卡埃爾·維德紐斯的女兒瑪麗亞(英語:Maria)的名字。

2018年12月11日 星期二

第一次使用與設定 NetBeans IDE

更新時間:12/11/2018

前言

IDE(Integrated Development Environment, 集成開發環境) 用於提供程序開發,您可以在這個 IDE 上可以完成編輯、編譯、連結、運行和除錯所有步驟。
使用 IDE 的好處是:
 (i) 可以幫您偵測哪一行代碼有問題,直接(編譯)顯示出語法警告或語法錯誤。
 (ii) 可以幫您很快調用所需的 API,擁有提示功能,方便查看 API 的聲明或者源代碼。
 (iii) 可以幫你去調試應用程序,查找程序錯誤。

2018年12月10日 星期一

安裝 NetBeans IDE

更新時間:12/10/2018

前言

NetBeans 是 Java 的集成開發環境(IDE)。NetBeans 允許從一組模組化軟件的組件開發應用程序,模組是一個 jar 檔(Java archive file)它包含了一組 Java 程式的類別而它們實作全依據依 NetBeans 定義了的公開介面以及一系列用來區分不同模組的定義描述檔(Manifest file)。NetBeans 可在 Microsoft Windows、macOS、Linux 和 Solaris 上運行。除了 Java 開發之外,它還有其他語言的擴展,如 PHP、C、C++、HTML5 和 Javascript。基於 NetBeans 的應用程序(包括 NetBeans IDE)可以由第三方開發人員進行擴展。

2018年12月8日 星期六

Java SE 入門教學 - 物件序列化與反序列化

更新時間:12/08/2018

前言

一個類別只有實現了 Serializable 介面,它的物件才是可序列化的。因此如果要序列化某些類別的物件,這些類別就必須實作 Serializable 介面。而實際上,Serializable 是一個空介面,沒有什麼具體內容,它的目的只是簡單的標識一個類別的物件可以被序列化。好處:

(i) 比如說你的記憶體不夠用了,那計算機就要將內存裡面的一部分物件暫時的保存到硬碟中,等到要用的時候再讀入到記憶體中。在比如說你要將某個特定的物件保存到文件中,我隔幾天再把它拿出來用,那麼這時候就要實作 Serializable 介面。

(ii) 在進行 java 的 Socket 編程的時候,你有時候可能要傳輸某一類別的物件,那麼也就要實作 Serializable 介面。最常見的你傳輸一個字符串,它是 JDK 裡面的類別,也實作了 Serializable 介面,所以可以在網絡上傳輸。

(iii) 如果要通過遠程的方法(RMI)去調用一個遠程物件的方法,如在計算機 A 中調用另一台計算機 B 的物件的方法,那麼你需要通過 JNDI 服務獲取計算機 B 目標物件的引用,將物件從 B 傳送到 A,就需要實作 Serializable 介面。例如,在 web 開發中,如果物件被保存在了 Session 中,tomcat 在重啟時要把 Session 物件序列化到硬碟,這個物件就必須實作 Serializable 介面。如果物件要經過分佈式系統進行網絡傳輸或通過 rmi 等遠程調用,這就需要在網絡上傳輸物件,被傳輸的物件就必須實作 Serializable 介面。

2018年12月7日 星期五

Java SE 入門教學 - properties文件 和 Properties類別

更新時間:12/07/2018

前言

在我們平時寫程序的時候,有些參數是經常改變的,而這種改變不是我們預知的。比如說我們開發了一個操作數據庫的模塊,在開發的時候我們連接本地的數據庫那麼 IP、數據庫名稱、數據庫表名稱、數據庫主機等信息是我們本地的,要使得這個操作數據的模塊具有通用性,那麼以上信息就不能寫死在程序裡。通常我們的做法是用配置文件來解決。

各種語言都有自己所支持的配置文件類型。比如 Python ,它支持 .ini 文件。因為他內部有一個 ConfigParser 類來支持 .ini 文件的讀寫,根據該類提供的方法程序員可以自由的來操作 .ini 文件。而在 Java 中,Java 支持的是 .properties 文件的讀寫,java.util.Properties 類別為我們操作 .properties 文件提供了便利。

在 Java 項目中,操作 properties 文件 是經常要做的,因為很多的配置信息都會寫在 properties 文件中,這種檔案被稱為屬性資源包(Property Resource Bundles)。每個參數被儲存為一對字串:一個儲存名稱參數(被稱為「鍵」),另一個儲存值。

2018年12月5日 星期三

Java SE 入門教學 - IO 流

更新時間:12/05/2018

前言

Java 流式輸入/輸出原理

在 Java 程序中,對於數據的輸入/輸出操作以「流(Stream)」方式進行;JDK提供了各種各樣「流」的類別,用以獲取不同種類的數據;程序中通過標準的方法輸入或輸出數據。

流是用來讀寫數據的,java 有一個類別叫 File,它封裝的是文件的文件名,只是記憶體裡面的一個物件,真正的文件是在硬碟上的一塊空間,在這個文件裡面存放著各種各樣的數據,我們想讀文件裡面的數據怎麼辦呢?是通過一個流的方式來讀,我們想從程序讀數據,對於計算機來說,無論讀什麼類型的數據都是以 010101101010 這樣的形式讀取的。怎麼把文件裡面的數據讀出來呢?您可以把文件想像成一個小桶,文件就是一個桶,文件裡面的數據就相當於是這個桶裡面的水,那麼我們怎麼從這個桶裡面取水呢?也就是怎麼從這個文件讀取數據呢?

常見的取水辦法是我們用一根管道插到桶上面,然後在管道的另一邊打開水龍頭,桶裡面的水就開始嘩啦嘩啦地從水龍頭里流出來了,桶裡面的水是通過這根管道流出來的,因此這根管道就叫流,Java 裡面的流式輸入/輸出跟水流的原理一模一樣,當您要從文件讀取數據的時候,一根管道插到文件裡面去,然後文件裡面的數據就順著管道流出來,這時你在管道的另一頭就可以讀取到從文件流出來的各種各樣的數據了。當您要往文件寫入數據時,也是通過一根管道,讓要寫入的數據通過這根管道嘩啦嘩啦地流進文件裡面去。除了從文件去取數據以外,還可以通過網絡,比如用一根管道把我和你的機子連接起來,我說一句話,通過這個管道流進你的機子裡面,你馬上就可以看得到,而你說一句話,通過這根管道流到我的機子裡面,我也馬上就可以看到。有的時候,一根管道不夠用,比方說這根管道流過來的水有一些雜質,我們就可以在這個根管道的外面再包一層管道,把雜質給過濾掉。從程序的角度來講,從計算機讀取到的原始數據肯定都是 010101 這種形式的,一個字節一個字節地往外讀,當你這樣讀的時候你覺得這樣的方法不合適,沒關係,你再在這根管道的外面再包一層比較強大的管道,這個管道可以把 010101 幫你轉換成字符串。這樣你使用程序讀取數據時讀到的就不再是 010101 這種形式的數據了,而是一些可以看得懂的字符串了。

2018年12月3日 星期一

Java SE 入門教學 - 集合

更新時間:12/03/2018

前言

Java 中的集合是一個框架,它提供了一個存儲和操作物件組的體系結構。能夠有系統的操作資料,是處理資料的好幫手。Java Collections 可以實現您對數據執行的所有操作,例如搜索,排序,插入,操作和刪除。

早在 Java 2 中之前,Java 就提供了特殊類別。比如:Dictionary, Vector, Stack, 和 Properties 這些類別用來存儲和操作物件組。雖然這些類別都非常有用,但是它們缺少一個核心的,統一的主題。由於這個原因,使用 Vector 類別的方式和使用 Properties 類別的方式有著很大不同。

集合框架被設計成要滿足以下幾個目標。

  • 該框架必須是高性能的。基本集合(動態數組,鍊錶,樹,哈希表)的實現也必須是高效的。
  • 該框架允許不同類型的集合,以類似的方式工作,具有高度的互操作性。
  • 對一個集合的擴展和適應必須是簡單的。

為此,整個集合框架就圍繞一組標準介面而設計。你可以直接使用這些介面的標準實現,諸如:LinkedList、HashSet 和 TreeSet 等,除此之外你也可以通過這些介面實現自己的集合。

此篇針對如何使用集合框架做個拋磚引玉,重點在於如何簡單的使用這些類別,更深入的瞭解集合框架不在此篇的討論範圍。