摘要:的基本網(wǎng)絡支持使用類沒有提供構(gòu)造器,而提供了兩個靜態(tài)方法來獲取實例根據(jù)主機獲取對應的對象根據(jù)原始地址來獲取對應的對象還提供了如下三個方法來獲取實例對應的地址和主機名獲取此地址的全限定域名返回該實例對應的地址字符串以字符串形式獲取此地址的主機
Java的基本網(wǎng)絡支持 使用InetAddress
InetAddress類沒有提供構(gòu)造器,而提供了兩個靜態(tài)方法來獲取InetAddress實例
getByName(String host):根據(jù)主機獲取對應的InetAddress對象
getByAddress(byte[] addr):根據(jù)原始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 { // 根據(jù)主機名來獲取對應的InetAddress實例 InetAddress ip = InetAddress.getByName("http://www.google.com/"); // 判斷是否可達 System.out.println("google是否可達:" + ip.isReachable(2000)); // 獲取該InetAddress實例的IP字符串 System.out.println(ip.getHostAddress()); // 根據(jù)原始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字符串之間的相互轉(zhuǎn)換
編程過程中可能涉及普通字符串和這種特殊字符串的相關(guān)轉(zhuǎn)換,這就需要使用URLDecoder類和URLEncoder類
URLDecoder類包含一個decoder(String s, String enc)靜態(tài)方法,它可以將看上去亂碼的特殊字符串轉(zhuǎn)換成普通字符串
URLEncoder類包含一個encoder(String s, String enc)靜態(tài)方法,它可以將普通字符串轉(zhuǎn)換為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字符串 // 轉(zhuǎn)換成普通字符串 String keyWord = URLDecoder.decode( "%E6%B5%B7%E8%B4%BC%E7%8E%8B", "utf-8"); System.out.println(keyWord); // 將普通字符串轉(zhuǎn)換成 // application/x-www-form-urlencoded字符串 String urlStr = URLEncoder.encode( "海賊王" , "GBK"); System.out.println(urlStr); } }URL、URLConnection和URLPermission
URL(Uniform Resource Locator)對象代表統(tǒng)一資源定位器,是指向互聯(lián)網(wǎng)“資源”的指針。資源可以是簡單的文件或目錄,也可以是對更復雜的對象的引用,例如對數(shù)據(jù)庫或搜索引擎的查詢
URL可以由協(xié)議名、主機、端口和資源組成,既滿足如下格式:
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的協(xié)議名稱
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數(shù)組 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); // 創(chuàng)建下載線程 threads[i] = new DownThread(startPos, currentPartSize, currentPart); // 啟動下載線程 threads[i].start(); } } // 獲取下載的完成百分比 public double getCompleteRate() { // 統(tǒng)計多條線程已經(jīng)下載的總大小 int sumSize = 0; for (int i = 0; i < threadNum; i++) { sumSize += threads[i].length; } // 返回已經(jīng)完成的百分比 return sumSize * 1.0 / fileSize; } private class DownThread extends Thread { // 當前線程的下載位置 private int startPos; // 定義當前線程負責下載的文件大小 private int currentPartSize; // 當前線程需要下載的文件塊 private RandomAccessFile currentPart; // 定義已經(jīng)該線程已下載的字節(jié)數(shù) 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個字節(jié),表明該線程只下載自己負責哪部分文件。 inStream.skip(this.startPos); byte[] buffer = new byte[1024]; int hasRead = 0; // 讀取網(wǎng)絡數(shù)據(jù),并寫入本地文件 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()方法負責如下步驟實現(xiàn)多線程下載:
創(chuàng)建URL對象
獲取指定URL對象所指向資源的大?。ㄍㄟ^getContentLength()方法獲得);URLConnection類代表Java應用程序和URL之間的通信連接
在本地磁盤上創(chuàng)建一個與網(wǎng)絡資源具有相同大小的空文件
計算每個線程應該下載網(wǎng)絡資源的哪個部分
依次創(chuàng)建、啟動多個線程來下載網(wǎng)絡資源的指定部分
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/66745.html
摘要:編程是目前最普遍的開發(fā)平臺,也是目前最主流的計算機技術(shù),編程以高效跨平臺而著稱,應用于網(wǎng)站移動開發(fā)平臺數(shù)據(jù)中心等領(lǐng)域。編程正在改變著全世界的生活。 Java編程是目前最普遍的開發(fā)平臺,也是目前最主流的計算機技術(shù),Java編程以高效、跨平臺而著稱,應用于網(wǎng)站、移動開發(fā)平臺、數(shù)據(jù)中心等領(lǐng)域??偲饋碚fJava編程是一種可以撰寫跨平臺應用軟件的面相對象的程序設計語言,尤其是在互聯(lián)網(wǎng)高速發(fā)展...
摘要:是領(lǐng)域最具代表性的問答網(wǎng)站之一。在,開發(fā)者能夠為各種相關(guān)的開源代碼貢獻自己的力量,也可以發(fā)布軟件開發(fā)項目。該網(wǎng)站發(fā)布各技術(shù)領(lǐng)域的高技術(shù)含量內(nèi)容,例如大數(shù)據(jù),云計算,,物聯(lián)網(wǎng),開發(fā)等。是一個大型的資源類網(wǎng)站,主要涉及源代碼和代碼示例。 Java是一種面向?qū)ο蟮木幊陶Z言,由Sun Microsystems公司在1995年的時候正式發(fā)布。直到今天,Java都一直是最受歡迎的編程語言之一。如今...
Java技術(shù)現(xiàn)象 關(guān)于Java技術(shù)的討論似乎無處不在,但究竟是什么呢?下面幾節(jié)將解釋Java技術(shù)如何既是一種編程語言又是一種平臺,并概述該技術(shù)可以為你做什么。 關(guān)于Java技術(shù) Java技術(shù)既是編程語言又是平臺。 Java編程語言 Java編程語言是一種高級語言,可以用以下所有流行語來描述它: 簡單的 體系結(jié)構(gòu)中立的 面向?qū)ο蟮?輕便的 分布式的 高性能的 多線程 健壯的 動態(tài)的 安全的 前面...
摘要:根據(jù)對社區(qū)和新特性的深刻理解,他創(chuàng)作了函數(shù)式編程一書。問你在倫敦社區(qū)的經(jīng)歷是否幫助你創(chuàng)作了函數(shù)式編程這本書絕對是這樣。我認為引入函數(shù)式編程會為很多編程任務提供方便。問之前的是面向?qū)ο蟮?,現(xiàn)在全面支持函數(shù)式編程。 非商業(yè)轉(zhuǎn)載請注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/article/199271 Richard Warburto...
摘要:學習編程的本最佳書籍這些書涵蓋了各個領(lǐng)域,包括核心基礎(chǔ)知識,集合框架,多線程和并發(fā),內(nèi)部和性能調(diào)優(yōu),設計模式等。擅長解釋錯誤及錯誤的原因以及如何解決簡而言之,這是學習中并發(fā)和多線程的最佳書籍之一。 showImg(https://segmentfault.com/img/remote/1460000018913016); 來源 | 愿碼(ChainDesk.CN)內(nèi)容編輯 愿碼Slo...
閱讀 3525·2021-10-13 09:40
閱讀 2651·2021-10-08 10:17
閱讀 4079·2021-09-28 09:45
閱讀 1003·2021-09-28 09:35
閱讀 1880·2019-08-30 10:51
閱讀 2964·2019-08-26 12:11
閱讀 1703·2019-08-26 10:41
閱讀 3147·2019-08-23 17:10