Java/Network Protocol/URLConnection
Содержание
- 1 A CGI POST Example
- 2 Call a servlet from a Java command line application
- 3 Check if a file was modified on the server
- 4 Demonstrate URLConnection.
- 5 Download from URL
- 6 Downloading a web page using URL and URLConnection classes
- 7 File size from URL
- 8 Get response header from HTTP request
- 9 Getting an Image from a URL
- 10 Getting Text from a URL
- 11 Get URLConnection Expiration
- 12 Http authentication header
- 13 Http Constants
- 14 Http Parser
- 15 Locating files by path or URL
- 16 Read a GIF or CLASS from an URL save it locally
- 17 Read / download webpage content
- 18 Sending a POST Request Using a URL
- 19 Sending a POST Request with Parameters From a Java Class
- 20 URLConnection.setRequestProperty
- 21 Zip URLConnection
- 22 Zip URLStream Handler
A CGI POST Example
<source lang="java">
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.URL; import java.net.URLConnection; public class CGIPost {
public static void main(String args[]) throws Exception { String fullURL = args[0]; URL u = new URL(fullURL); URLConnection conn = u.openConnection(); conn.setDoOutput(true); OutputStream theControl = conn.getOutputStream(); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(theControl)); for (int i = 1; i < args.length; i++) { out.write(args[i] + "\n"); } out.close(); InputStream theData = conn.getInputStream(); String contentType = conn.getContentType(); if (contentType.toLowerCase().startsWith("text")) { BufferedReader in = new BufferedReader(new InputStreamReader(theData)); String line; while ((line = in.readLine()) != null) { System.out.println(line); } } }
}
</source>
Call a servlet from a Java command line application
<source lang="java">
import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.URL; import java.net.URLConnection; public class CounterApp {
public static void main(String args[])throws Exception { String sessionCookie = null; URL url = new java.net.URL("http://127.0.0.1/yourServlet"); URLConnection con = url.openConnection(); if (sessionCookie != null) { con.setRequestProperty("cookie", sessionCookie); } con.setUseCaches(false); con.setDoOutput(true); con.setDoInput(true); ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(byteOut); out.flush(); byte buf[] = byteOut.toByteArray(); con.setRequestProperty("Content-type", "application/octet-stream"); con.setRequestProperty("Content-length", "" + buf.length); DataOutputStream dataOut = new DataOutputStream(con.getOutputStream()); dataOut.write(buf); dataOut.flush(); dataOut.close(); DataInputStream in = new DataInputStream(con.getInputStream()); int count = in.readInt(); in.close(); if (sessionCookie == null) { String cookie = con.getHeaderField("set-cookie"); if (cookie != null) { sessionCookie = parseCookie(cookie); System.out.println("Setting session ID=" + sessionCookie); } } System.out.println(count); } public static String parseCookie(String raw) { String c = raw; if (raw != null) { int endIndex = raw.indexOf(";"); if (endIndex >= 0) { c = raw.substring(0, endIndex); } } return c; }
}
</source>
Check if a file was modified on the server
<source lang="java">
import java.net.URL; import java.net.URLConnection; public class Main {
public static void main(String[] argv) throws Exception { URL u = new URL("http://127.0.0.1/test.gif"); URLConnection uc = u.openConnection(); uc.setUseCaches(false); long timestamp = uc.getLastModified(); }
}
</source>
Demonstrate URLConnection.
<source lang="java">
import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.Date; import java.util.Enumeration; import java.util.Hashtable; import java.util.StringTokenizer; public class MainClass {
public static void main(String args[]) throws Exception { int c; URL hp = new URL("http://www.internic.net"); URLConnection hpCon = hp.openConnection(); long d = hpCon.getDate(); if (d == 0) System.out.println("No date information."); else System.out.println("Date: " + new Date(d)); System.out.println("Content-Type: " + hpCon.getContentType()); d = hpCon.getExpiration(); if (d == 0) System.out.println("No expiration information."); else System.out.println("Expires: " + new Date(d)); d = hpCon.getLastModified(); if (d == 0) System.out.println("No last-modified information."); else System.out.println("Last-Modified: " + new Date(d)); int len = hpCon.getContentLength(); if (len == -1) System.out.println("Content length unavailable."); else System.out.println("Content-Length: " + len); if (len != 0) { InputStream input = hpCon.getInputStream(); int i = len; while (((c = input.read()) != -1)) { // && (--i > 0)) { System.out.print((char) c); } input.close(); } else { System.out.println("No content available."); } }
}
</source>
Download from URL
<source lang="java">
import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; public class Utils {
public static void download(String urlStr, File destFile) throws IOException { URL srcUrl = new URL(urlStr); InputStream input = null; OutputStream output = null; try { input = srcUrl.openStream(); FileOutputStream fos = new FileOutputStream(destFile); output = new BufferedOutputStream(fos); copyStreams(input, output); } finally { if (input != null) { input.close(); } if (output != null) { output.flush(); output.close(); } } } private static void copyStreams(InputStream input, OutputStream output) throws IOException { int count; byte data[] = new byte[1024]; while ((count = input.read(data, 0, 1024)) != -1) { output.write(data, 0, count); } }
}
</source>
Downloading a web page using URL and URLConnection classes
<source lang="java">
import java.io.BufferedInputStream; import java.net.URL; import java.net.URLConnection; public class Main {
public static void main(String[] args) throws Exception { URLConnection urlc = new URL("http://www.google.ru").openConnection(); BufferedInputStream buffer = new BufferedInputStream(urlc.getInputStream()); int byteRead; while ((byteRead = buffer.read()) != -1){ System.out.println((char) byteRead); } buffer.close(); }
}
</source>
File size from URL
<source lang="java">
import java.net.URL; import java.net.URLConnection; public class Main {
public static void main(String[] argv) throws Exception { int size; URL url = new URL("http://www.server.ru"); URLConnection conn = url.openConnection(); size = conn.getContentLength(); if (size < 0) System.out.println("Could not determine file size."); else System.out.println(size); conn.getInputStream().close(); }
}
</source>
Get response header from HTTP request
<source lang="java">
import java.net.URL; import java.net.URLConnection; import java.util.Iterator; import java.util.List; import java.util.Map; public class Main {
public static void main(String[] args) throws Exception { URL url = new URL("http://www.google.ru/index.html"); URLConnection connection = url.openConnection(); Map responseMap = connection.getHeaderFields(); for (Iterator iterator = responseMap.keySet().iterator(); iterator.hasNext();) { String key = (String) iterator.next(); System.out.println(key + " = "); List values = (List) responseMap.get(key); for (int i = 0; i < values.size(); i++) { Object o = values.get(i); System.out.println(o + ", "); } } }
}
</source>
Getting an Image from a URL
<source lang="java">
import java.awt.Image; import java.awt.Toolkit; import java.net.URL; public class Main {
public static void main(String[] argv) throws Exception { URL url = new URL("http://hostname:80/image.gif"); Image image = Toolkit.getDefaultToolkit().getDefaultToolkit().createImage(url); }
}
</source>
Getting Text from a URL
<source lang="java">
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; public class Main {
public static void main(String[] argv) throws Exception { URL url = new URL("http://hostname:80/index.html"); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); String str; while ((str = in.readLine()) != null) { System.out.println(str); } in.close(); }
}
</source>
Get URLConnection Expiration
<source lang="java">
/*
GNU LESSER GENERAL PUBLIC LICENSE Copyright (C) 2006 The Lobo Project This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Contact info: lobochief@users.sourceforge.net
- /
/*
* Created on Jun 12, 2005 */
import java.net.*; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.*; import java.util.logging.*; public class Urls {
private static final Logger logger = Logger.getLogger(Urls.class.getName());
public static final DateFormat PATTERN_RFC1123 = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
static {
DateFormat df = PATTERN_RFC1123;
df.setTimeZone(TimeZone.getTimeZone("GMT"));
}
private Urls() {
super();
}
/** Whether the URL refers to a resource in the local file system. */
public static boolean isLocal(java.net.URL url) {
if(isLocalFile(url)) {
return true;
}
String protocol = url.getProtocol();
if("jar".equalsIgnoreCase(protocol)) {
String path = url.getPath();
int emIdx = path.lastIndexOf("!");
String subUrlString = emIdx == -1 ? path : path.substring(0, emIdx);
try {
URL subUrl = new URL(subUrlString);
return isLocal(subUrl);
} catch(java.net.MalformedURLException mfu) {
return false;
}
}
else {
return false;
}
}
/** Whether the URL is a file in the local file system. */
public static boolean isLocalFile(java.net.URL url) {
String scheme = url.getProtocol();
return "file".equalsIgnoreCase(scheme) && !hasHost(url);
}
public static boolean hasHost(java.net.URL url) {
String host = url.getHost();
return host != null && !"".equals(host);
}
/**
* Creates an absolute URL in a manner equivalent to
* major browsers.
*/
public static URL createURL(URL baseUrl, String relativeUrl) throws java.net.MalformedURLException {
return new URL(baseUrl, relativeUrl);
}
/**
* Returns the time when the document should be considered expired.
* The time will be zero if the document always needs to be revalidated.
* It will be null
if no expiration time is specified.
*/
public static Long getExpiration(URLConnection connection, long baseTime) {
String cacheControl = connection.getHeaderField("Cache-Control");
if(cacheControl != null) {
StringTokenizer tok = new StringTokenizer(cacheControl, ",");
while(tok.hasMoreTokens()) {
String token = tok.nextToken().trim().toLowerCase();
if("must-revalidate".equals(token)) {
return new Long(0);
}
else if(token.startsWith("max-age")) {
int eqIdx = token.indexOf("=");
if(eqIdx != -1) {
String value = token.substring(eqIdx+1).trim();
int seconds;
try {
seconds = Integer.parseInt(value);
return new Long(baseTime + seconds * 1000);
} catch(NumberFormatException nfe) {
logger.warning("getExpiration(): Bad Cache-Control max-age value: " + value);
// ignore
}
}
}
}
}
String expires = connection.getHeaderField("Expires");
if(expires != null) {
try {
synchronized(PATTERN_RFC1123) {
Date expDate = PATTERN_RFC1123.parse(expires);
return new Long(expDate.getTime());
}
} catch(java.text.ParseException pe) {
int seconds;
try {
seconds = Integer.parseInt(expires);
return new Long(baseTime + seconds * 1000);
} catch(NumberFormatException nfe) {
logger.warning("getExpiration(): Bad Expires header value: " + expires);
}
}
}
return null;
}
private static String getDefaultCharset(URLConnection connection) {
URL url = connection.getURL();
if(Urls.isLocalFile(url)) {
String charset = System.getProperty("file.encoding");
return charset == null ? "ISO-8859-1" : charset;
}
else {
return "ISO-8859-1";
}
}
public static String getNoRefForm(URL url) {
String host = url.getHost();
int port = url.getPort();
String portText = port == -1 ? "" : ":" + port;
String userInfo = url.getUserInfo();
String userInfoText = userInfo == null || userInfo.length() == 0 ? "" : userInfo + "@";
String hostPort = host == null || host.length() == 0 ? "" : "//" + userInfoText + host + portText;
return url.getProtocol() + ":" + hostPort + url.getFile();
}
}
</source>
Http authentication header
<source lang="java"> import java.net.HttpURLConnection;
import java.net.URL; import java.net.URLConnection; import java.util.List; import java.util.Map; public class BasicAuthNeeded {
public static void main(String[] args) throws Exception { String s; s = "http://www.y.ru/authTest"; URL url = new URL(s); URLConnection urlc = url.openConnection(); Map<String, List<String>> hf = urlc.getHeaderFields(); for (String key : hf.keySet()) System.out.println(key + ": " + urlc.getHeaderField(key)); System.out.println(((HttpURLConnection) urlc).getResponseCode()); }
}
</source>
Http Constants
<source lang="java">
/*
* Copyright 2007 Outerthought bvba and Schaubroeck nv * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */
public class HttpConstants {
public final static String GET = "GET", POST = "POST", HEAD = "HEAD", PUT = "PUT", OPTIONS = "OPTIONS", DELETE = "DELETE"; // These are copy-pasted from the Jetty codebase public final static int _100_Continue = 100, _101_Switching_Protocols = 101, _102_Processing = 102, _200_OK = 200, _201_Created = 201, _202_Accepted = 202, _203_Non_Authoritative_Information = 203, _204_No_Content = 204, _205_Reset_Content = 205, _206_Partial_Content = 206, _207_Multi_Status = 207, _300_Multiple_Choices = 300, _301_Moved_Permanently = 301, _302_Moved_Temporarily = 302, _302_Found = 302, _303_See_Other = 303, _304_Not_Modified = 304, _305_Use_Proxy = 305, _400_Bad_Request = 400, _401_Unauthorized = 401, _402_Payment_Required = 402, _403_Forbidden = 403, _404_Not_Found = 404, _405_Method_Not_Allowed = 405, _406_Not_Acceptable = 406, _407_Proxy_Authentication_Required = 407, _408_Request_Timeout = 408, _409_Conflict = 409, _410_Gone = 410, _411_Length_Required = 411, _412_Precondition_Failed = 412, _413_Request_Entity_Too_Large = 413, _414_Request_URI_Too_Large = 414, _415_Unsupported_Media_Type = 415, _416_Requested_Range_Not_Satisfiable = 416, _417_Expectation_Failed = 417, _422_Unprocessable_Entity = 422, _423_Locked = 423, _424_Failed_Dependency = 424, _500_Internal_Server_Error = 500, _501_Not_Implemented = 501, _502_Bad_Gateway = 502, _503_Service_Unavailable = 503, _504_Gateway_Timeout = 504, _505_HTTP_Version_Not_Supported = 505, _507_Insufficient_Storage = 507, _999_Unknown = 999; public final static String MIMETYPE_TEXT_HTML = "text/html", MIMETYPE_TEXT_PLAIN = "text/plain", MIMETYPE_TEXT_XML = "text/xml", MIMETYPE_TEXT_HTML_8859_1 = "text/html; charset=iso-8859-1", MIMETYPE_TEXT_PLAIN_8859_1 = "text/plain; charset=iso-8859-1", MIMETYPE_TEXT_XML_8859_1 = "text/xml; charset=iso-8859-1", MIMETYPE_TEXT_HTML_UTF_8 = "text/html; charset=utf-8", MIMETYPE_TEXT_PLAIN_UTF_8 = "text/plain; charset=utf-8", MIMETYPE_TEXT_XML_UTF_8 = "text/xml; charset=utf-8";
}
</source>
Http Parser
<source lang="java">
/** Copyright (C) 2004 Juho Vähä-Herttua This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- /
import java.io.*; import java.util.*; import java.text.*; import java.net.URLDecoder; public class HttpParser {
private static final String[][] HttpReplies = {{"100", "Continue"}, {"101", "Switching Protocols"}, {"200", "OK"}, {"201", "Created"}, {"202", "Accepted"}, {"203", "Non-Authoritative Information"}, {"204", "No Content"}, {"205", "Reset Content"}, {"206", "Partial Content"}, {"300", "Multiple Choices"}, {"301", "Moved Permanently"}, {"302", "Found"}, {"303", "See Other"}, {"304", "Not Modified"}, {"305", "Use Proxy"}, {"306", "(Unused)"}, {"307", "Temporary Redirect"}, {"400", "Bad Request"}, {"401", "Unauthorized"}, {"402", "Payment Required"}, {"403", "Forbidden"}, {"404", "Not Found"}, {"405", "Method Not Allowed"}, {"406", "Not Acceptable"}, {"407", "Proxy Authentication Required"}, {"408", "Request Timeout"}, {"409", "Conflict"}, {"410", "Gone"}, {"411", "Length Required"}, {"412", "Precondition Failed"}, {"413", "Request Entity Too Large"}, {"414", "Request-URI Too Long"}, {"415", "Unsupported Media Type"}, {"416", "Requested Range Not Satisfiable"}, {"417", "Expectation Failed"}, {"500", "Internal Server Error"}, {"501", "Not Implemented"}, {"502", "Bad Gateway"}, {"503", "Service Unavailable"}, {"504", "Gateway Timeout"}, {"505", "HTTP Version Not Supported"}}; private BufferedReader reader; private String method, url; private Hashtable headers, params; private int[] ver; public HttpParser(InputStream is) { reader = new BufferedReader(new InputStreamReader(is)); method = ""; url = ""; headers = new Hashtable(); params = new Hashtable(); ver = new int[2]; } public int parseRequest() throws IOException { String initial, prms[], cmd[], temp[]; int ret, idx, i; ret = 200; // default is OK now initial = reader.readLine(); if (initial == null || initial.length() == 0) return 0; if (Character.isWhitespace(initial.charAt(0))) { // starting whitespace, return bad request return 400; } cmd = initial.split("\\s"); if (cmd.length != 3) { return 400; } if (cmd[2].indexOf("HTTP/") == 0 && cmd[2].indexOf(".") > 5) { temp = cmd[2].substring(5).split("\\."); try { ver[0] = Integer.parseInt(temp[0]); ver[1] = Integer.parseInt(temp[1]); } catch (NumberFormatException nfe) { ret = 400; } } else ret = 400; if (cmd[0].equals("GET") || cmd[0].equals("HEAD")) { method = cmd[0]; idx = cmd[1].indexOf("?"); if (idx < 0) url = cmd[1]; else { url = URLDecoder.decode(cmd[1].substring(0, idx), "ISO-8859-1"); prms = cmd[1].substring(idx+1).split("&"); params = new Hashtable(); for (i=0; i<prms.length; i++) { temp = prms[i].split("="); if (temp.length == 2) { // we use ISO-8859-1 as temporary charset and then // String.getBytes("ISO-8859-1") to get the data params.put(URLDecoder.decode(temp[0], "ISO-8859-1"), URLDecoder.decode(temp[1], "ISO-8859-1")); } else if(temp.length == 1 && prms[i].indexOf("=") == prms[i].length()-1) { // handle empty string separatedly params.put(URLDecoder.decode(temp[0], "ISO-8859-1"), ""); } } } parseHeaders(); if (headers == null) ret = 400; } else if (cmd[0].equals("POST")) { ret = 501; // not implemented } else if (ver[0] == 1 && ver[1] >= 1) { if (cmd[0].equals("OPTIONS") || cmd[0].equals("PUT") || cmd[0].equals("DELETE") || cmd[0].equals("TRACE") || cmd[0].equals("CONNECT")) { ret = 501; // not implemented } } else { // meh not understand, bad request ret = 400; } if (ver[0] == 1 && ver[1] >= 1 && getHeader("Host") == null) { ret = 400; } return ret; } private void parseHeaders() throws IOException { String line; int idx; // that fscking rfc822 allows multiple lines, we don"t care now line = reader.readLine(); while (!line.equals("")) { idx = line.indexOf(":"); if (idx < 0) { headers = null; break; } else { headers.put(line.substring(0, idx).toLowerCase(), line.substring(idx+1).trim()); } line = reader.readLine(); } } public String getMethod() { return method; } public String getHeader(String key) { if (headers != null) return (String) headers.get(key.toLowerCase()); else return null; } public Hashtable getHeaders() { return headers; } public String getRequestURL() { return url; } public String getParam(String key) { return (String) params.get(key); } public Hashtable getParams() { return params; } public String getVersion() { return ver[0] + "." + ver[1]; } public int compareVersion(int major, int minor) { if (major < ver[0]) return -1; else if (major > ver[0]) return 1; else if (minor < ver[1]) return -1; else if (minor > ver[1]) return 1; else return 0; } public static String getHttpReply(int codevalue) { String key, ret; int i; ret = null; key = "" + codevalue; for (i=0; i<HttpReplies.length; i++) { if (HttpReplies[i][0].equals(key)) { ret = codevalue + " " + HttpReplies[i][1]; break; } } return ret; } public static String getDateHeader() { SimpleDateFormat format; String ret; format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss", Locale.US); format.setTimeZone(TimeZone.getTimeZone("GMT")); ret = "Date: " + format.format(new Date()) + " GMT"; return ret; }
}
</source>
Locating files by path or URL
<source lang="java">
/*
* JBoss, Home of Professional Open Source * Copyright 2006, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. * See the copyright.txt in the distribution for a * full listing of individual contributors. * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU Lesser General Public License, v. 2.1. * This program is distributed in the hope that it will be useful, but WITHOUT A * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public License, * v.2.1 along with this distribution; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * (C) 2005-2006, * @author JBoss Inc. */
/*
- Copyright (C) 1998, 1999, 2000, 2001,
- Arjuna Solutions Limited,
- Newcastle upon Tyne,
- Tyne and Wear,
- UK.
- $Id: FileLocator.java 2342 2006-03-30 13:06:17Z $
- /
import java.io.File; import java.net.URL; import java.io.FileNotFoundException; import java.net.MalformedURLException; /**
* The FileLocator class provides a common method for locating files. * If not passed an absolute filename (starting with the string "abs://"), * it searches for the file in the order: * in the directory specified by the system property user.dir * in the directory specified by the system property user.home * in the directory specified by the system property java.home * using the getResource() method * * @author Julian Coleman * @version $Id: FileLocator.java 2342 2006-03-30 13:06:17Z $ * @since JTS 3.0. */
public class FileLocator {
/** * Locate the specific file. * Return the (URL decoded) abolute pathname to the file or null. */ public static String locateFile (String findFile) throws FileNotFoundException { URL url; String fullPathName; StringBuffer decodedPathName; int pos, len, start; if (findFile == null) throw new FileNotFoundException("locateFile: null file name"); if (findFile.startsWith(absolutePath)) return findFile.substring(absolutePath.length()); if ((fullPathName = locateByProperty(findFile)) != null) return fullPathName; if ((url = locateByResource(findFile)) != null) { /* * The URL that we receive from getResource /might/ have " " * (space) characters converted to "%20" strings. However, * it doesn"t have other URL encoding (e.g "+" characters are * kept intact), so we"ll just convert all "%20" strings to * " " characters and hope for the best. */ fullPathName = url.getFile(); pos = 0; len = fullPathName.length(); start = 0; decodedPathName = new StringBuffer(); while ((pos = fullPathName.indexOf(pct20, start)) != -1) { decodedPathName.append(fullPathName.substring(start, pos)); decodedPathName.append(" "); start = pos + pct20len; } if (start < len) decodedPathName.append(fullPathName.substring(start, len)); fullPathName=decodedPathName.toString(); if (platformIsWindows()) fullPathName = fullPathName.substring(1, fullPathName.length()); return fullPathName; } throw new FileNotFoundException("locateFile: file not found: " + findFile); } /** * Locate the specific file. * Return the file name in URL form or null. */ public static URL locateURL (String findFile) throws FileNotFoundException { URL url; String fullPathName; if (findFile == null) throw new FileNotFoundException("locateURL: null file name"); try { if (findFile.startsWith(absolutePath)) { return (new URL("file:/" + findFile.substring(absolutePath.length()))); } if ((fullPathName = locateByProperty(findFile)) != null) { if(platformIsWindows()) url = new URL("file:/" + fullPathName); else url = new URL("file:" + fullPathName); return url; } //TODO: TR: used for testing: return new URL(findFile); } catch (MalformedURLException e) { System.err.println("locateURL: URL creation problem"); throw new FileNotFoundException("locateURL: URL creation problem"); } if ((url = locateByResource(findFile)) != null) return url; throw new FileNotFoundException("locateURL: file not found: " + findFile); } /** * Search for a file using the properties: user.dir, user.home, java.home * Returns absolute path name or null. */ private static synchronized String locateByProperty(String findFile) { String fullPathName = null; String dir = null; File f = null; if (findFile == null) return null; try { // System.err.println("Searching in user.dir for: " + findFile); dir = System.getProperty("user.dir"); if (dir != null) { fullPathName = dir + File.separatorChar + findFile; f = new File(fullPathName); } if (f != null && f.exists()) { // System.err.println("Found in user.dir"); return fullPathName; } dir = System.getProperty("user.home"); if (dir != null) { fullPathName = dir + File.separatorChar + findFile; f = new File(fullPathName); } if (f != null && f.exists()) { // System.err.println("Found in user.home"); return fullPathName; } dir = System.getProperty("java.home"); if (dir != null) { fullPathName = dir + File.separatorChar + findFile; f = new File(fullPathName); } if (f != null && f.exists()) { // System.err.println("Found in java.home"); return fullPathName; } } catch (Exception e) { return null; } return null; } /** * Search for a file using the properties: user.dir, user.home, java.home * Returns URL or null. */ private static URL locateByResource(String findFile) { ClassLoader loader = Thread.currentThread().getContextClassLoader(); URL url = loader.getResource(findFile); if (url == null) { url = FileLocator.class.getResource("/" + findFile); } // System.err.println("Search succeeded via getResource()"); return url; } /* * Check the file separator to see if we"re on a Windows platform. * * @return boolean True if the platform is Windows, false otherwise. */ private static boolean platformIsWindows() { if(File.separatorChar == "\\") { return true; } return false; } private static final String absolutePath = "abs://"; private static final String pct20 = "%20"; private static final int pct20len = 3;
}
</source>
Read a GIF or CLASS from an URL save it locally
<source lang="java">
import java.io.DataInputStream; import java.io.FileOutputStream; import java.net.URL; import java.net.URLConnection; public class Main {
public static void main(String args[]) throws Exception { byte[] b = new byte[1]; URL url = new URL("http://www.server.ru/a.gif"); URLConnection urlConnection = url.openConnection(); urlConnection.connect(); DataInputStream di = new DataInputStream(urlConnection.getInputStream()); FileOutputStream fo = new FileOutputStream("a.gif"); while (-1 != di.read(b, 0, 1)) fo.write(b, 0, 1); di.close(); fo.close(); }
}
</source>
Read / download webpage content
<source lang="java">
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.InputStreamReader; import java.net.URL; public class Main {
public static void main(String[] args) throws Exception { URL url = new URL("http://www.google.ru"); BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); BufferedWriter writer = new BufferedWriter(new FileWriter("data.html")); String line; while ((line = reader.readLine()) != null) { System.out.println(line); writer.write(line); writer.newLine(); } reader.close(); writer.close(); }
}
</source>
Sending a POST Request Using a URL
<source lang="java">
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; public class Main {
public static void main(String[] argv) throws Exception { String data = URLEncoder.encode("key1", "UTF-8") + "=" + URLEncoder.encode("value1", "UTF-8"); data += "&" + URLEncoder.encode("key2", "UTF-8") + "=" + URLEncoder.encode("value2", "UTF-8"); URL url = new URL("http://server.ru:80/cgi"); URLConnection conn = url.openConnection(); conn.setDoOutput(true); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write(data); wr.flush(); BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line = rd.readLine()) != null) { System.out.println(line); } wr.close(); rd.close(); }
}
</source>
Sending a POST Request with Parameters From a Java Class
<source lang="java">
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.URL; import java.net.URLConnection; public class Main {
public static void main(String[] args) throws Exception { URL url = new URL("http://www.jexp.ru"); URLConnection conn = url.openConnection(); conn.setDoOutput(true); OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream()); writer.write("value=1&anotherValue=1"); writer.flush(); String line; BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); while ((line = reader.readLine()) != null) { System.out.println(line); } writer.close(); reader.close(); }
}
</source>
URLConnection.setRequestProperty
<source lang="java">
import java.io.InputStream; import java.net.URL; import java.net.URLConnection; class MainClass {
public static void main(String[] args) throws Exception { URL url = new URL("http://www.x.ru"); URLConnection urlc = url.openConnection(); urlc.setRequestProperty("User-Agent", "Mozilla 5.0 (Windows; U; " + "Windows NT 5.1; en-US; rv:1.8.0.11) "); InputStream is = urlc.getInputStream(); int c; while ((c = is.read()) != -1) System.out.print((char) c); }
}
</source>
Zip URLConnection
<source lang="java">
/**
* The utillib library. * More information is available at http://www.jinchess.ru/. * Copyright (C) 2003 Alexander Maryanovsky. * All rights reserved. * * The utillib library is free software; you can redistribute * it and/or modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * The utillib library is distributed in the hope that it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with utillib library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
import java.net.URL; import java.net.URLConnection; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipFile; import java.util.zip.ZipEntry;
/**
* A URLConnection
which loads its content from a specified zip
* entry within a local file.
*/
public class ZipURLConnection extends URLConnection{
/** * The zip file. */ private final File file;
/** * The name of the zip entry within the zip file. */ private final String zipEntryName;
/** * TheZipFile
object for the zip file. Created when *connect()
is called. */ private ZipFile zipFile = null;
/** * TheZipEntry
object for the entry in the zip file. Created * whenconnect()
is called. */ private ZipEntry zipEntry = null;
/** * Creates a newZipURLConnection
for the specified zip entry * within the specifiedFile
. */ public ZipURLConnection(URL url, File file, String zipEntryName){ super(url); this.file = file; this.zipEntryName = zipEntryName; }
/** * Attempts to open the zip entry. */ public void connect() throws IOException{ this.zipFile = new ZipFile(file); this.zipEntry = zipFile.getEntry(zipEntryName); if (zipEntry == null) throw new IOException("Entry " + zipEntryName + " not found in file " + file); this.connected = true; }
/**
* Returns the InputStream
that reads from this connection.
*/
public InputStream getInputStream() throws IOException{
if (!connected)
connect();
return zipFile.getInputStream(zipEntry);
}
/** * Returns the length of the uncompressed zip entry. */ public int getContentLength(){ if (!connected) return -1; return (int)zipEntry.getSize(); }
}
</source>
Zip URLStream Handler
<source lang="java">
/**
* The utillib library. * More information is available at http://www.jinchess.ru/. * Copyright (C) 2003 Alexander Maryanovsky. * All rights reserved. * * The utillib library is free software; you can redistribute * it and/or modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * The utillib library is distributed in the hope that it will * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with utillib library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; import java.util.zip.ZipEntry; import java.util.zip.ZipFile;
/**
*A URLStreamHandler which allows accessing specific zip entries within a
* zip file. The format of the file part of the URL is
* [full path to the zip file]|[name of zip entry]
, but you are
* encouraged to use the
* createURL(String fileName, String entryName)
method
* instead of creating a URL manually. The host and port part of the URL should
* be null
. An application is responsible for setting a
* URLStreamHandlerFactory
that will return a ZipURLStreamHandler
* when appropriate.
*/
public class ZipURLStreamHandler extends URLStreamHandler{
/**
* Returns a ZipURLConnection for the specified URL.
*/
public URLConnection openConnection(URL url) throws IOException{
String urlFile = url.getFile();
int barIndex = urlFile.indexOf("|");
if (barIndex == -1)
throw new MalformedURLException("Missing "|"");
String fileName = urlFile.substring(0, barIndex);
String entryName = urlFile.substring(barIndex + 1);
return new ZipURLConnection(url, new File(fileName), entryName);
}
/**
* Parses the specified URL string.
*/
protected void parseURL(URL url, String spec, int start, int limit){
String urlFile = url.getFile();
int barIndex = urlFile.indexOf("|");
String fileName = barIndex == -1 ? urlFile : urlFile.substring(0, barIndex);
String entryName = barIndex == -1 ? "" : urlFile.substring(barIndex + 1);
int lastSlashIndex = entryName.lastIndexOf("/");
String newEntryName = entryName.substring(0, lastSlashIndex + 1) + spec.substring(start, limit);
setURL(url, url.getProtocol(), "", -1, fileName + "|" + newEntryName, null);
}
/**
* Creates a URL
that points to the specified entry within the
* specified zip file. The URL
will have "zip" as the protocol
* name. To use the resulting URL
, an application must set
* a URLStreamHandlerFactory
(via the URL
class)
* which will return a ZipURLStreamHandler
for the "zip"
* protocol. Returns null
if the "zip: protocol is unrecognized.
*/
public static URL createURL(String fileName, String entryName){
return createURL("zip", fileName, entryName);
}
/**
* Creates a URL
that points to the specified entry within the
* specified zip file and has the specified protocol name. To use the
* resulting URL
, an application must set a
* URLStreamHandlerFactory
(via the URL
class)
* which will return a ZipURLStreamHandler
for the protocol name
* given to this method. Returns null
if the specified protocol
* is unrecognized.
*/
public static URL createURL(String protocol, String fileName, String entryName){
try{
return new URL(protocol, "", -1, fileName + "|" + entryName);
} catch (MalformedURLException e){
e.printStackTrace();
return null;
}
}
}
/**
* The utillib library.
* More information is available at http://www.jinchess.ru/.
* Copyright (C) 2003 Alexander Maryanovsky.
* All rights reserved.
*
* The utillib library is free software; you can redistribute
* it and/or modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* The utillib library is distributed in the hope that it will
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
* General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with utillib library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/**
* A URLConnection
which loads its content from a specified zip
* entry within a local file.
*/
class ZipURLConnection extends URLConnection{
/**
* The zip file.
*/
private final File file;
/**
* The name of the zip entry within the zip file.
*/
private final String zipEntryName;
/**
* The ZipFile
object for the zip file. Created when
* connect()
is called.
*/
private ZipFile zipFile = null;
/**
* The ZipEntry
object for the entry in the zip file. Created
* when connect()
is called.
*/
private ZipEntry zipEntry = null;
/**
* Creates a new ZipURLConnection
for the specified zip entry
* within the specified File
.
*/
public ZipURLConnection(URL url, File file, String zipEntryName){
super(url);
this.file = file;
this.zipEntryName = zipEntryName;
}
/**
* Attempts to open the zip entry.
*/
public void connect() throws IOException{
this.zipFile = new ZipFile(file);
this.zipEntry = zipFile.getEntry(zipEntryName);
if (zipEntry == null)
throw new IOException("Entry " + zipEntryName + " not found in file " + file);
this.connected = true;
}
/**
* Returns the InputStream
that reads from this connection.
*/
public InputStream getInputStream() throws IOException{
if (!connected)
connect();
return zipFile.getInputStream(zipEntry);
}
/**
* Returns the length of the uncompressed zip entry.
*/
public int getContentLength(){
if (!connected)
return -1;
return (int)zipEntry.getSize();
}
}
</source>