Todos acham que é real.Mar. 30, 1999USA136 Min.
You know, in Java, we can use the classes URLand HttpURLConnection in the package java.net to programmatically download a file from a given URL by following these steps:
http://jdbc.postgresql.org/download/postgresql-9.2-1002.jdbc4.jar
http://myserver.com/download?id=1234
package
com.douglas.networking;
import
java.io.File;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.net.HttpURLConnection;
import
java.net.URL;
public
class
HttpDownloadUtility {
private
static
final
int
BUFFER_SIZE =
4096
;
/**
* Downloads a file from a URL
* @param fileURL HTTP URL of the file to be downloaded
* @param saveDir path of the directory to save the file
* @throws IOException
*/
public
static
void
downloadFile(String fileURL, String saveDir)
throws
IOException {
URL url =
new
URL(fileURL);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
int
responseCode = httpConn.getResponseCode();
// always check HTTP response code first
if
(responseCode == HttpURLConnection.HTTP_OK) {
String fileName =
""
;
String disposition = httpConn.getHeaderField(
"Content-Disposition"
);
String contentType = httpConn.getContentType();
int
contentLength = httpConn.getContentLength();
if
(disposition !=
null
) {
// extracts file name from header field
int
index = disposition.indexOf(
"filename="
);
if
(index >
0
) {
fileName = disposition.substring(index +
10
,
disposition.length() -
1
);
}
}
else
{
// extracts file name from URL
fileName = fileURL.substring(fileURL.lastIndexOf(
"/"
) +
1
,
fileURL.length());
}
System.out.println(
"Content-Type = "
+ contentType);
System.out.println(
"Content-Disposition = "
+ disposition);
System.out.println(
"Content-Length = "
+ contentLength);
System.out.println(
"fileName = "
+ fileName);
// opens input stream from the HTTP connection
InputStream inputStream = httpConn.getInputStream();
String saveFilePath = saveDir + File.separator + fileName;
// opens an output stream to save into file
FileOutputStream outputStream =
new
FileOutputStream(saveFilePath);
int
bytesRead = -
1
;
byte
[] buffer =
new
byte
[BUFFER_SIZE];
while
((bytesRead = inputStream.read(buffer)) != -
1
) {
outputStream.write(buffer,
0
, bytesRead);
}
outputStream.close();
inputStream.close();
System.out.println(
"File downloaded"
);
}
else
{
System.out.println(
"No file to download.
Server replied HTTP code: "
+ responseCode);
}
httpConn.disconnect();
}
}
Note that in the static method downloadFile(), we have to check HTTP response code from the server to make sure the URL is available (HTTP status 200). Then we extract the file name either from the HTTP header Content-Disposition (in case the URL is an indirect link), or from the URL itself (in case the URL is the direct link). We also print out some debugging information like Content-Type, Content-Disposition, Content-Length and file name.And here is a test program which employs the utility class above:12345678910111213141516 package
net.codejava.networking;
import
java.io.IOException;
public
class
HttpDownloader {
public
static
void
main(String[] args) {
String fileURL =
"http://jdbc.postgresql.org/download
/postgresql-9.2-1002.jdbc4.jar"
;
String saveDir =
"E:/Download"
;
try
{
HttpDownloadUtility.downloadFile(fileURL, saveDir);
}
catch
(IOException ex) {
ex.printStackTrace();
}
}
}
This program downloads the file postgresql-9.2-1002.jdbc4.jar and saves it into the directory E:/Download. It would produce the following output:12345 Content-Type = application/java-archive
Content-Disposition = null
Content-Length = 579785
fileName = postgresql-9.2-1002.jdbc4.jar
File downloaded