摘要:的基本網(wǎng)絡(luò)支持使用類(lèi)沒(méi)有提供構(gòu)造器,而提供了兩個(gè)靜態(tài)方法來(lái)獲取實(shí)例根據(jù)主機(jī)獲取對(duì)應(yīng)的對(duì)象根據(jù)原始地址來(lái)獲取對(duì)應(yīng)的對(duì)象還提供了如下三個(gè)方法來(lái)獲取實(shí)例對(duì)應(yīng)的地址和主機(jī)名獲取此地址的全限定域名返回該實(shí)例對(duì)應(yīng)的地址字符串以字符串形式獲取此地址的主機(jī)
Java的基本網(wǎng)絡(luò)支持 使用InetAddress
InetAddress類(lèi)沒(méi)有提供構(gòu)造器,而提供了兩個(gè)靜態(tài)方法來(lái)獲取InetAddress實(shí)例
getByName(String host):根據(jù)主機(jī)獲取對(duì)應(yīng)的InetAddress對(duì)象
getByAddress(byte[] addr):根據(jù)原始IP地址來(lái)獲取對(duì)應(yīng)的InetAddress對(duì)象
InetAddress還提供了如下三個(gè)方法來(lái)獲取InetAddress實(shí)例對(duì)應(yīng)的IP地址和主機(jī)名:
String getCanonicalHostName():獲取此IP地址的全限定域名
String getHostAddress():返回該InetAddress實(shí)例對(duì)應(yīng)的IP地址字符串(以字符串形式)
String getHostName():獲取此IP地址的主機(jī)名
InetAddress類(lèi)還提供了一個(gè)getLocalHost()方法來(lái)獲取本機(jī)IP地址對(duì)應(yīng)的InetAddress實(shí)例
InetAddress類(lèi)還提供了一個(gè)isReachable()方法,用于測(cè)試是否可以到達(dá)該地址,該方法將盡最大努力試圖到達(dá)主機(jī)
import java.net.*; public class InetAddressTest { public static void main(String[] args) throws Exception { // 根據(jù)主機(jī)名來(lái)獲取對(duì)應(yīng)的InetAddress實(shí)例 InetAddress ip = InetAddress.getByName("http://www.google.com/"); // 判斷是否可達(dá) System.out.println("google是否可達(dá):" + ip.isReachable(2000)); // 獲取該InetAddress實(shí)例的IP字符串 System.out.println(ip.getHostAddress()); // 根據(jù)原始IP地址來(lái)獲取對(duì)應(yīng)的InetAddress實(shí)例 InetAddress local = InetAddress.getByAddress( new byte[]{127,0,0,1}); System.out.println("本機(jī)是否可達(dá):" + local.isReachable(5000)); // 獲取該InetAddress實(shí)例對(duì)應(yīng)的全限定域名 System.out.println(local.getCanonicalHostName()); } }使用URLDecoder和URLEncoder
URLDecoder和URLEncoder用于完成普通字符串和application/x-www-form-urlencoded MIME字符串之間的相互轉(zhuǎn)換
編程過(guò)程中可能涉及普通字符串和這種特殊字符串的相關(guān)轉(zhuǎn)換,這就需要使用URLDecoder類(lèi)和URLEncoder類(lèi)
URLDecoder類(lèi)包含一個(gè)decoder(String s, String enc)靜態(tài)方法,它可以將看上去亂碼的特殊字符串轉(zhuǎn)換成普通字符串
URLEncoder類(lèi)包含一個(gè)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)對(duì)象代表統(tǒng)一資源定位器,是指向互聯(lián)網(wǎng)“資源”的指針。資源可以是簡(jiǎn)單的文件或目錄,也可以是對(duì)更復(fù)雜的對(duì)象的引用,例如對(duì)數(shù)據(jù)庫(kù)或搜索引擎的查詢(xún)
URL可以由協(xié)議名、主機(jī)、端口和資源組成,既滿(mǎn)足如下格式:
protocal://host:port/resourceName
例如如下的URL地址:
http://china.nba.com/teamindex/
String getFile():獲取此LRL的資源名
String getHost():獲取此URL的主機(jī)名
String getPath():獲取此URL的路徑部分
int getPort():獲取此URL的端口號(hào)
String getProtocal():獲取此URL的協(xié)議名稱(chēng)
String getQuery():獲取此URL的查詢(xún)字符串部分
URLConnecton openConnection():返回一個(gè)URLConnection對(duì)象,它表示到URL所引用的遠(yuǎn)程對(duì)象的連接
InoutStream openStream():打開(kāi)與此URL的連接,并返回一個(gè)用于讀取該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; // 定義下載的線程對(duì)象 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"); // 設(shè)置本地文件的大小 file.setLength(fileSize); file.close(); for (int i = 0; i < threadNum; i++) { // 計(jì)算每條線程的下載的開(kāi)始位置 int startPos = i * currentPartSize; // 每個(gè)線程使用一個(gè)RandomAccessFile進(jìn)行下載 RandomAccessFile currentPart = new RandomAccessFile(targetFile, "rw"); // 定位該線程的下載位置 currentPart.seek(startPos); // 創(chuàng)建下載線程 threads[i] = new DownThread(startPos, currentPartSize, currentPart); // 啟動(dòng)下載線程 threads[i].start(); } } // 獲取下載的完成百分比 public double getCompleteRate() { // 統(tǒng)計(jì)多條線程已經(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 { // 當(dāng)前線程的下載位置 private int startPos; // 定義當(dāng)前線程負(fù)責(zé)下載的文件大小 private int currentPartSize; // 當(dāng)前線程需要下載的文件塊 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(); // 跳過(guò)startPos個(gè)字節(jié),表明該線程只下載自己負(fù)責(zé)哪部分文件。 inStream.skip(this.startPos); byte[] buffer = new byte[1024]; int hasRead = 0; // 讀取網(wǎng)絡(luò)數(shù)據(jù),并寫(xiě)入本地文件 while (length < currentPartSize && (hasRead = inStream.read(buffer)) != -1) { currentPart.write(buffer, 0, hasRead); // 累計(jì)該線程下載的總大小 length += hasRead; } currentPart.close(); inStream.close(); } catch (Exception e) { e.printStackTrace(); } } } }
DownUtils類(lèi)的download()方法負(fù)責(zé)如下步驟實(shí)現(xiàn)多線程下載:
創(chuàng)建URL對(duì)象
獲取指定URL對(duì)象所指向資源的大小(通過(guò)getContentLength()方法獲得);URLConnection類(lèi)代表Java應(yīng)用程序和URL之間的通信連接
在本地磁盤(pán)上創(chuàng)建一個(gè)與網(wǎng)絡(luò)資源具有相同大小的空文件
計(jì)算每個(gè)線程應(yīng)該下載網(wǎng)絡(luò)資源的哪個(gè)部分
依次創(chuàng)建、啟動(dòng)多個(gè)線程來(lái)下載網(wǎng)絡(luò)資源的指定部分
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66745.html
摘要:編程是目前最普遍的開(kāi)發(fā)平臺(tái),也是目前最主流的計(jì)算機(jī)技術(shù),編程以高效跨平臺(tái)而著稱(chēng),應(yīng)用于網(wǎng)站移動(dòng)開(kāi)發(fā)平臺(tái)數(shù)據(jù)中心等領(lǐng)域。編程正在改變著全世界的生活。 Java編程是目前最普遍的開(kāi)發(fā)平臺(tái),也是目前最主流的計(jì)算機(jī)技術(shù),Java編程以高效、跨平臺(tái)而著稱(chēng),應(yīng)用于網(wǎng)站、移動(dòng)開(kāi)發(fā)平臺(tái)、數(shù)據(jù)中心等領(lǐng)域??偲饋?lái)說(shuō)Java編程是一種可以撰寫(xiě)跨平臺(tái)應(yīng)用軟件的面相對(duì)象的程序設(shè)計(jì)語(yǔ)言,尤其是在互聯(lián)網(wǎng)高速發(fā)展...
摘要:是領(lǐng)域最具代表性的問(wèn)答網(wǎng)站之一。在,開(kāi)發(fā)者能夠?yàn)楦鞣N相關(guān)的開(kāi)源代碼貢獻(xiàn)自己的力量,也可以發(fā)布軟件開(kāi)發(fā)項(xiàng)目。該網(wǎng)站發(fā)布各技術(shù)領(lǐng)域的高技術(shù)含量?jī)?nèi)容,例如大數(shù)據(jù),云計(jì)算,,物聯(lián)網(wǎng),開(kāi)發(fā)等。是一個(gè)大型的資源類(lèi)網(wǎng)站,主要涉及源代碼和代碼示例。 Java是一種面向?qū)ο蟮木幊陶Z(yǔ)言,由Sun Microsystems公司在1995年的時(shí)候正式發(fā)布。直到今天,Java都一直是最受歡迎的編程語(yǔ)言之一。如今...
Java技術(shù)現(xiàn)象 關(guān)于Java技術(shù)的討論似乎無(wú)處不在,但究竟是什么呢?下面幾節(jié)將解釋Java技術(shù)如何既是一種編程語(yǔ)言又是一種平臺(tái),并概述該技術(shù)可以為你做什么。 關(guān)于Java技術(shù) Java技術(shù)既是編程語(yǔ)言又是平臺(tái)。 Java編程語(yǔ)言 Java編程語(yǔ)言是一種高級(jí)語(yǔ)言,可以用以下所有流行語(yǔ)來(lái)描述它: 簡(jiǎn)單的 體系結(jié)構(gòu)中立的 面向?qū)ο蟮?輕便的 分布式的 高性能的 多線程 健壯的 動(dòng)態(tài)的 安全的 前面...
摘要:根據(jù)對(duì)社區(qū)和新特性的深刻理解,他創(chuàng)作了函數(shù)式編程一書(shū)。問(wèn)你在倫敦社區(qū)的經(jīng)歷是否幫助你創(chuàng)作了函數(shù)式編程這本書(shū)絕對(duì)是這樣。我認(rèn)為引入函數(shù)式編程會(huì)為很多編程任務(wù)提供方便。問(wèn)之前的是面向?qū)ο蟮?,現(xiàn)在全面支持函數(shù)式編程。 非商業(yè)轉(zhuǎn)載請(qǐng)注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/article/199271 Richard Warburto...
摘要:學(xué)習(xí)編程的本最佳書(shū)籍這些書(shū)涵蓋了各個(gè)領(lǐng)域,包括核心基礎(chǔ)知識(shí),集合框架,多線程和并發(fā),內(nèi)部和性能調(diào)優(yōu),設(shè)計(jì)模式等。擅長(zhǎng)解釋錯(cuò)誤及錯(cuò)誤的原因以及如何解決簡(jiǎn)而言之,這是學(xué)習(xí)中并發(fā)和多線程的最佳書(shū)籍之一。 showImg(https://segmentfault.com/img/remote/1460000018913016); 來(lái)源 | 愿碼(ChainDesk.CN)內(nèi)容編輯 愿碼Slo...
閱讀 3363·2021-10-13 09:40
閱讀 2601·2021-10-08 10:17
閱讀 4006·2021-09-28 09:45
閱讀 938·2021-09-28 09:35
閱讀 1819·2019-08-30 10:51
閱讀 2910·2019-08-26 12:11
閱讀 1655·2019-08-26 10:41
閱讀 3103·2019-08-23 17:10