摘要:的基本網絡支持使用類沒有提供構造器,而提供了兩個靜態方法來獲取實例根據主機獲取對應的對象根據原始地址來獲取對應的對象還提供了如下三個方法來獲取實例對應的地址和主機名獲取此地址的全限定域名返回該實例對應的地址字符串以字符串形式獲取此地址的主機
Java的基本網絡支持 使用InetAddress
InetAddress類沒有提供構造器,而提供了兩個靜態方法來獲取InetAddress實例
getByName(String host):根據主機獲取對應的InetAddress對象
getByAddress(byte[] addr):根據原始IP地址來獲取對應的InetAddress對象
InetAddress還提供了如下三個方法來獲取InetAddress實例對應的IP地址和主機名:
String getCanonicalHostName():獲取此IP地址的全限定域名
String getHostAddress():返回該InetAddress實例對應的IP地址字符串(以字符串形式)
String getHostName():獲取此IP地址的主機名
InetAddress類還提供了一個getLocalHost()方法來獲取本機IP地址對應的InetAddress實例
InetAddress類還提供了一個isReachable()方法,用于測試是否可以到達該地址,該方法將盡最大努力試圖到達主機
import java.net.*; public class InetAddressTest { public static void main(String[] args) throws Exception { // 根據主機名來獲取對應的InetAddress實例 InetAddress ip = InetAddress.getByName("http://www.google.com/"); // 判斷是否可達 System.out.println("google是否可達:" + ip.isReachable(2000)); // 獲取該InetAddress實例的IP字符串 System.out.println(ip.getHostAddress()); // 根據原始IP地址來獲取對應的InetAddress實例 InetAddress local = InetAddress.getByAddress( new byte[]{127,0,0,1}); System.out.println("本機是否可達:" + local.isReachable(5000)); // 獲取該InetAddress實例對應的全限定域名 System.out.println(local.getCanonicalHostName()); } }使用URLDecoder和URLEncoder
URLDecoder和URLEncoder用于完成普通字符串和application/x-www-form-urlencoded MIME字符串之間的相互轉換
編程過程中可能涉及普通字符串和這種特殊字符串的相關轉換,這就需要使用URLDecoder類和URLEncoder類
URLDecoder類包含一個decoder(String s, String enc)靜態方法,它可以將看上去亂碼的特殊字符串轉換成普通字符串
URLEncoder類包含一個encoder(String s, String enc)靜態方法,它可以將普通字符串轉換為application/x-www-form-urlencoded MIME字符串
import java.net.*; public class URLDecoderTest { public static void main(String[] args) throws Exception { // 將application/x-www-form-urlencoded字符串 // 轉換成普通字符串 String keyWord = URLDecoder.decode( "%E6%B5%B7%E8%B4%BC%E7%8E%8B", "utf-8"); System.out.println(keyWord); // 將普通字符串轉換成 // application/x-www-form-urlencoded字符串 String urlStr = URLEncoder.encode( "海賊王" , "GBK"); System.out.println(urlStr); } }URL、URLConnection和URLPermission
URL(Uniform Resource Locator)對象代表統一資源定位器,是指向互聯網“資源”的指針。資源可以是簡單的文件或目錄,也可以是對更復雜的對象的引用,例如對數據庫或搜索引擎的查詢
URL可以由協議名、主機、端口和資源組成,既滿足如下格式:
protocal://host:port/resourceName
例如如下的URL地址:
http://china.nba.com/teamindex/
String getFile():獲取此LRL的資源名
String getHost():獲取此URL的主機名
String getPath():獲取此URL的路徑部分
int getPort():獲取此URL的端口號
String getProtocal():獲取此URL的協議名稱
String getQuery():獲取此URL的查詢字符串部分
URLConnecton openConnection():返回一個URLConnection對象,它表示到URL所引用的遠程對象的連接
InoutStream openStream():打開與此URL的連接,并返回一個用于讀取該URL資源的InputStream
import java.io.InputStream; import java.io.RandomAccessFile; import java.net.*; public class DownUtil { // 定義下載資源的路徑 private String path; // 指定所下載的文件的保存位置 private String targetFile; // 定義需要使用多少線程下載資源 private int threadNum; // 定義下載的線程對象 private DownThread[] threads; // 定義下載的文件的總大小 private int fileSize; public DownUtil(String path, String targetFile, int threadNum) { this.path = path; this.threadNum = threadNum; // 初始化threads數組 threads = new DownThread[threadNum]; this.targetFile = targetFile; } public void download() throws Exception { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5 * 1000); conn.setRequestMethod("GET"); conn.setRequestProperty( "Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, " + "application/x-shockwave-flash, application/xaml+xml, " + "application/vnd.ms-xpsdocument, application/x-ms-xbap, " + "application/x-ms-application, application/vnd.ms-excel, " + "application/vnd.ms-powerpoint, application/msword, */*"); conn.setRequestProperty("Accept-Language", "zh-CN"); conn.setRequestProperty("Charset", "UTF-8"); conn.setRequestProperty("Connection", "Keep-Alive"); // 得到文件大小 fileSize = conn.getContentLength(); conn.disconnect(); int currentPartSize = fileSize / threadNum + 1; RandomAccessFile file = new RandomAccessFile(targetFile, "rw"); // 設置本地文件的大小 file.setLength(fileSize); file.close(); for (int i = 0; i < threadNum; i++) { // 計算每條線程的下載的開始位置 int startPos = i * currentPartSize; // 每個線程使用一個RandomAccessFile進行下載 RandomAccessFile currentPart = new RandomAccessFile(targetFile, "rw"); // 定位該線程的下載位置 currentPart.seek(startPos); // 創建下載線程 threads[i] = new DownThread(startPos, currentPartSize, currentPart); // 啟動下載線程 threads[i].start(); } } // 獲取下載的完成百分比 public double getCompleteRate() { // 統計多條線程已經下載的總大小 int sumSize = 0; for (int i = 0; i < threadNum; i++) { sumSize += threads[i].length; } // 返回已經完成的百分比 return sumSize * 1.0 / fileSize; } private class DownThread extends Thread { // 當前線程的下載位置 private int startPos; // 定義當前線程負責下載的文件大小 private int currentPartSize; // 當前線程需要下載的文件塊 private RandomAccessFile currentPart; // 定義已經該線程已下載的字節數 public int length; public DownThread(int startPos, int currentPartSize, RandomAccessFile currentPart) { this.startPos = startPos; this.currentPartSize = currentPartSize; this.currentPart = currentPart; } @Override public void run() { try { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection)url .openConnection(); conn.setConnectTimeout(5 * 1000); conn.setRequestMethod("GET"); conn.setRequestProperty( "Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, " + "application/x-shockwave-flash, application/xaml+xml, " + "application/vnd.ms-xpsdocument, application/x-ms-xbap, " + "application/x-ms-application, application/vnd.ms-excel, " + "application/vnd.ms-powerpoint, application/msword, */*"); conn.setRequestProperty("Accept-Language", "zh-CN"); conn.setRequestProperty("Charset", "UTF-8"); InputStream inStream = conn.getInputStream(); // 跳過startPos個字節,表明該線程只下載自己負責哪部分文件。 inStream.skip(this.startPos); byte[] buffer = new byte[1024]; int hasRead = 0; // 讀取網絡數據,并寫入本地文件 while (length < currentPartSize && (hasRead = inStream.read(buffer)) != -1) { currentPart.write(buffer, 0, hasRead); // 累計該線程下載的總大小 length += hasRead; } currentPart.close(); inStream.close(); } catch (Exception e) { e.printStackTrace(); } } } }
DownUtils類的download()方法負責如下步驟實現多線程下載:
創建URL對象
獲取指定URL對象所指向資源的大小(通過getContentLength()方法獲得);URLConnection類代表Java應用程序和URL之間的通信連接
在本地磁盤上創建一個與網絡資源具有相同大小的空文件
計算每個線程應該下載網絡資源的哪個部分
依次創建、啟動多個線程來下載網絡資源的指定部分
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66745.html
摘要:編程是目前最普遍的開發平臺,也是目前最主流的計算機技術,編程以高效跨平臺而著稱,應用于網站移動開發平臺數據中心等領域。編程正在改變著全世界的生活。 Java編程是目前最普遍的開發平臺,也是目前最主流的計算機技術,Java編程以高效、跨平臺而著稱,應用于網站、移動開發平臺、數據中心等領域。總起來說Java編程是一種可以撰寫跨平臺應用軟件的面相對象的程序設計語言,尤其是在互聯網高速發展...
摘要:是領域最具代表性的問答網站之一。在,開發者能夠為各種相關的開源代碼貢獻自己的力量,也可以發布軟件開發項目。該網站發布各技術領域的高技術含量內容,例如大數據,云計算,,物聯網,開發等。是一個大型的資源類網站,主要涉及源代碼和代碼示例。 Java是一種面向對象的編程語言,由Sun Microsystems公司在1995年的時候正式發布。直到今天,Java都一直是最受歡迎的編程語言之一。如今...
Java技術現象 關于Java技術的討論似乎無處不在,但究竟是什么呢?下面幾節將解釋Java技術如何既是一種編程語言又是一種平臺,并概述該技術可以為你做什么。 關于Java技術 Java技術既是編程語言又是平臺。 Java編程語言 Java編程語言是一種高級語言,可以用以下所有流行語來描述它: 簡單的 體系結構中立的 面向對象的 輕便的 分布式的 高性能的 多線程 健壯的 動態的 安全的 前面...
摘要:根據對社區和新特性的深刻理解,他創作了函數式編程一書。問你在倫敦社區的經歷是否幫助你創作了函數式編程這本書絕對是這樣。我認為引入函數式編程會為很多編程任務提供方便。問之前的是面向對象的,現在全面支持函數式編程。 非商業轉載請注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/article/199271 Richard Warburto...
摘要:學習編程的本最佳書籍這些書涵蓋了各個領域,包括核心基礎知識,集合框架,多線程和并發,內部和性能調優,設計模式等。擅長解釋錯誤及錯誤的原因以及如何解決簡而言之,這是學習中并發和多線程的最佳書籍之一。 showImg(https://segmentfault.com/img/remote/1460000018913016); 來源 | 愿碼(ChainDesk.CN)內容編輯 愿碼Slo...
閱讀 3351·2021-10-13 09:40
閱讀 2586·2021-10-08 10:17
閱讀 3989·2021-09-28 09:45
閱讀 922·2021-09-28 09:35
閱讀 1805·2019-08-30 10:51
閱讀 2898·2019-08-26 12:11
閱讀 1645·2019-08-26 10:41
閱讀 3091·2019-08-23 17:10