URL定义
统一资源标识符(Uniform Resource Identifier ,URL)是采用一种特定语法标识一个资源的字符串。所标识的资源可能是服务器上的一个文件。Java的URL网络类可以让你通过URL去练级网络服务器并获取资源。
URL的格式如下:
protocol://host:port/path?query#fragment
例如:https://www.baidu.com/
protocol(协议)可以是HTTP,HTTPS,FTP和File,port为端口号,path为文件路径及文件名。
URL类
构造函数
方法 | 描述 |
URL(String spec) | 从 String表示形成一个 URL对象。 |
URL(String protocol, String host, int port, String file) | 创建 URL从指定对象 protocol , host , port数,和 file 。 |
URL(String protocol, String host, int port, String file, URLStreamHandler handler) | 创建 URL从指定对象 protocol , host , port数, file和 handler 。 |
URL(String protocol, String host, String file) | 从指定的 protocol名称, host名称和 file名称创建一个URL。 |
URL(URL context, String spec) | 通过在指定的上下文中解析给定的规范来创建一个URL。 |
URL(URL context, String spec, URLStreamHandler handler) | 通过在指定上下文中使用指定的处理程序解析给定规范来创建URL。 |
方法
方法 | 描述 |
boolean equals(Object obj) | 将此URL与其他对象进行比较。 |
String getAuthority() | 获取此的授权部分 URL 。 |
Object getContent() | 获取此URL的内容。 |
Object getContent(类[] classes) | 获取此URL的内容。 |
int getDefaultPort() | 获取与此 URL的协议的默认端口号。 |
String getFile() | 获取此 URL的文件名。 |
String getHost() | 获取此 URL的主机名(如适用)。 |
String getPath() | 获取此 URL的路径部分。 |
int getPort() | 获取此 URL的端口号。 |
String getProtocol() | 获取此 URL的协议名称。 |
String getQuery() | 获取此 URL的查询部分。 |
String getRef() | 获取此的锚定(也称为“参考”) URL 。 |
String getUserInfo() | 获取该 URL的userInfo部分。 |
int hashCode() | 创建适合哈希表索引的整数。 |
URLConnection openConnection() | 返回一个URLConnection实例,表示与URL引用的远程对象的URL 。 |
URLConnection openConnection(Proxy proxy) | 与openConnection()相同,但连接将通过指定的代理进行; 不支持代理的协议处理程序将忽略代理参数并进行正常连接。 |
InputStream openStream() | 打开与此 URL ,并返回一个 InputStream ,以便从该连接读取。 |
boolean sameFile(URL other) | 比较两个URL,不包括片段组件。 |
static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac) | 设置应用程序的 URLStreamHandlerFactory 。 |
String toExternalForm() | 构造这个 URL的字符串 URL 。 |
String toString() | 构造此 URL的字符串表示 URL 。 |
URI toURI() | 返回相当于此URL的URI 。 |
URL类本身不会根据RFC2396中定义的转义机制对任何URL组件进行编码或解码。 来电者有责任编码任何需要在调用URL之前进行转义的字段,并对从URL返回的任何转义字段进行解码。 此外,由于URL不具有URL转义的知识,因此不能识别同一URL的编码或解码形式之间的等同性。 例如,两个URL:
http://foo.com/hello world/
http://foo.com/hello%20world
将被视为不相等。
注意:在某些情况下, URI类确实执行其组件字段的转义。 管理URL编码和解码的推荐方法是使用URI ,并使用toURI()和URI.toURL()在这两个类之间进行转换。
也可以使用URLEncoder和URLDecoder类,但仅适用于与RFC2396中定义的编码方案不同的HTML表单编码。
URL类的常规使用
package dream.URL.test;
import java.io.*;
import java.net.*;
public class URLTest {
//获取网页数据
static void getFromURL1(String url){
URL u;
try {
u = new URL(url);
URLConnection uc=u.openConnection();
InputStream in=uc.getInputStream();
byte[] b=new byte[1024];
int len;
while((len=in.read(b))!=-1)
{
System.out.println(new String(b,0,len));
}
in.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
return ;
}
//获取URL网页数据
static void getFromURL2(String url){
URL u=null;
BufferedReader in=null;
try {
u = new URL(url);
in=new BufferedReader(new InputStreamReader(u.openStream(),"UTF-8"));
String str;
while((str=in.readLine())!=null) {
System.out.println(str);
}
in.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
if(in!=null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return ;
}
static void getContent(String url) {
try {
URL u=new URL(url);
System.out.println(u.getPort());
Object ob=u.getContent();
System.out.println("i get a "+ob.getClass().toString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return;
}
//获取URL服务器数据
static void getURLDetails(String url){
try {
URL u=new URL(url);
System.out.println(u);
System.out.println"文件类型:"+);
System.out.println("使用的协议: " + u.getProtocol()); //获取URL里面的超文本协议
//System.out.println("The user info is " + u.getUserInfo());//
String host = u.getHost();
if (host != null) {
int atSign = host.indexOf('@');
if (atSign != -1) host = host.substring(atSign+1);
System.out.println("主机名称:" + host);
} else {
System.out.println("主机名称: null.");
}
System.out.println("端口号: " + u.getDefaultPort());
System.out.println("默认端口:" + u.getDefaultPort());
System.out.println("路径: " + u.getPath());
System.out.println("定位位置: " + u.getRef());
System.out.println("请求参数: " + u.getQuery());
System.out.println("文件名及请求参数:" + u.getFile());
System.out.println("验证信息:" + u.getAuthority());
} catch (MalformedURLException ex) {
System.err.println(url + " is not a URL I understand.");
}
return ;
}
//从输入流中获取字节数组
public static byte[] readInputStream(InputStream inputStream) throws IOException {
byte[] b = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建字节流缓冲区存取字节
while((len = inputStream.read(b)) != -1) {
bos.write(b, 0, len);
}
bos.close();
return bos.toByteArray();
}
//获取文件的类型和名字
public static String getFileName(String url) {
int sta1=url.lastIndexOf(".");
char[] tchar=new char[1024];
url.getChars(sta1, url.length(), tchar, 0);
int sta2=url.lastIndexOf("/");
char[] tchar1=new char[1024];
url.getChars(sta2+1, sta1, tchar1, 0);
String s=new String();
for(char i:tchar1) {
if(i=='\0') {
break;
}
s+=i;
}
for(char i:tchar) {
if(i=='\0') {
break;
}
s+=i;
}
return s;
}
//从URL下载文件
public static void downLoadFormURL(String url,String filePath) {
try {
URL u=new URL(url);//获取URL
HttpURLConnection conn=(HttpURLConnection) u.openConnection();
conn.setConnectTimeout(3000);//设置连接超时时间
//屏蔽403错误
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
InputStream in=conn.getInputStream();//获取输入流
byte[] data=readInputStream(in);
File file=new File(filePath);
if(!file.isDirectory()) {
System.out.println("存放路径不对");
}
if(!file.exists()) {//路径不存在就创建
file.mkdirs();
}
System.out.println(getFileName(url));
File save=new File(file.getPath()+"//"+getFileName(url));
System.out.println(save.getPath());
FileOutputStream fos = new FileOutputStream(save);
fos.write(data);
if(fos!=null){
fos.close();
}
if(in!=null){
in.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
System.err.println(e.toString());
e.printStackTrace();
}
}
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
//System.out.println(getFileName("http://www.baidu.com"));
String url="https://ss1.baidu.com/9vo3dSag_xI4khGko9WTAnF6hhy/image/h%3D300/sign=10da86d6df43ad4bb92e40c0b2035a89/"
+ "03087bf40ad162d93b3a196f1fdfa9ec8b13cde9.jpg";
downLoadFormURL(url,"E:\\");//下载文件
//getFromURL2("http://www.baidu.com");
//getContent("http://d1.sina.com.cn/200903/11/168512_whh_950_450.jpg");
//getURLDetails("http://www.runoob.com/index.html?language=cn#j2se");
}
}
URLConnections类
抽象类URLConnection是表示应用程序和URL之间的通信链接的所有类的超类。 该类的实例可以用于从URL引用的资源中读取和写入。
- 通过在URL上调用openConnection方法创建连接对象。
- 设置参数和一般请求属性被操纵。
- 使用connect方法实现与远程对象的实际连接。
- 远程对象变得可用。 可以访问头字段和远程对象的内容。
构造方法 | 描述 |
protected URLConnection(URL url) | 构造与指定URL的URL连接。 |
URLConnections类的方法
方法 | 说明 |
void addRequestProperty(String key, String value) | 添加由键值对指定的一般请求属性。 |
abstract void connect() | 打开与此URL引用的资源的通信链接,如果此类连接尚未建立。 |
boolean getAllowUserInteraction() | 返回此对象的 allowUserInteraction字段的值。 |
int getConnectTimeout() | 返回连接超时的设置。 |
Object getContent() | 检索此URL连接的内容。 |
Object getContent(类[] classes) | 检索此URL连接的内容。 |
String getContentEncoding() | 返回 content-encoding标题字段的值。 |
int getContentLength() | 返回 content-length标题字段的值。 |
long getContentLengthLong() | 返回 content-length标头字段的值为long。 |
String getContentType() | 返回 content-type标题字段的值。 |
long getDate() | 返回 date标题字段的值。 |
static boolean getDefaultAllowUserInteraction() | 返回 allowUserInteraction字段的默认值。 |
static String getDefaultRequestProperty(String key) | (已弃用 )在获得适当的URLConnection实例之后,应该使用实例特定的getRequestProperty方法。 |
boolean getDefaultUseCaches() | 返回默认值为 URLConnection的 useCaches标志。 |
boolean getDoInput() | 返回此 URLConnection的 doInput标志的值。 |
boolean getDoOutput() | 返回此 URLConnection的 doOutput标志的值。 |
long getExpiration() | 返回 expires标题字段的值。 |
static FileNameMap getFileNameMap() | 从数据文件加载文件名映射(模拟)。 |
String getHeaderField(int n) | 返回的值 n th头字段。 |
String getHeaderField(String name) | 返回命名头字段的值。 |
long getHeaderFieldDate(String name, long Default) | 返回以日期解析的命名字段的值。 |
int getHeaderFieldInt(String name, int Default) | 返回被解析为命名字段的值。 |
String getHeaderFieldKey(int n) | 返回的关键 n th头字段。 |
long getHeaderFieldLong(String name, long Default) | 返回被解析为命名字段的值。 |
Map<String,List> getHeaderFields() | 返回不可修改的标题字段的映射。 |
long getIfModifiedSince() | 返回此对象的 ifModifiedSince字段的值。 |
InputStream getInputStream() | 返回从此打开的连接读取的输入流。 |
long getLastModified() | 返回 last-modified标题字段的值。 |
OutputStream getOutputStream() | 返回写入此连接的输出流。 |
Permission getPermission() | 返回一个权限对象,该对象表示创建此对象所表示的连接所需的权限。 |
int getReadTimeout() | 返回读取超时的设置。 |
Map<String,List> getRequestProperties() | 返回此连接的一般请求属性的不可修改映射。 |
String getRequestProperty(String key) | 返回此连接的命名的常规请求属性的值。 |
URL getURL() | 返回此 URLConnection的 URL字段的值。 |
boolean getUseCaches() | 返回此 URLConnection的 useCaches字段的值。 |
static String guessContentTypeFromName(String fname) | 根据URL的指定“文件”组件,尝试确定对象的内容类型。 |
static String guessContentTypeFromStream(InputStream is) | 根据输入流开头的字符,尝试确定输入流的类型。 |
void setAllowUserInteraction(boolean allowuserinteraction) | 设置这个 URLConnection的 allowUserInteraction字段的值。 |
void setConnectTimeout(int timeout) | 设置打开与此URLConnection引用的资源的通信链接时使用的指定超时值(以毫秒为单位)。 |
static void setContentHandlerFactory(ContentHandlerFactory fac) | 设置应用 ContentHandlerFactory的ContentHandlerFactory。 |
static void setDefaultAllowUserInteraction(boolean defaultallowuserinteraction) | 将所有将来的 URLConnection对象的 allowUserInteraction字段的默认值设置为指定的值。 |
static void setDefaultRequestProperty(String key, String value) | 已弃用 在获得适当的URLConnection实例之后,应该使用实例特定的setRequestProperty方法。 调用此方法将不起作用。 |
void setDefaultUseCaches(boolean defaultusecaches) | 将 useCaches字段的默认值设置为指定值。 |
void setDoInput(boolean doinput) | 设置的值 doInput领域本 URLConnection指定值。 |
void setDoOutput(boolean dooutput) | 设置的值 doOutput领域本 URLConnection指定值。 |
static void setFileNameMap(FileNameMap map) | 设置FileNameMap。 |
void setIfModifiedSince(long ifmodifiedsince) | 设置的值 ifModifiedSince这个领域 URLConnection到指定值。 |
void setReadTimeout(int timeout) | 将读取超时设置为指定的超时时间,以毫秒为单位。 |
void setRequestProperty(String key, String value) | 设置一般请求属性。 |
void setUseCaches(boolean usecaches) | 设置的值 useCaches这个领域 URLConnection到指定值。 |
String toString() | 返回 String此URL连接的表示。 |