我们可以使用Socket类(SSLSocket类)发送http(https)请求的程序,但是如果网页指向的是一个文件或者资源,用Socket是无法完成网页下载任务的,但我们可以使用URL类来下载网页指定的资源。
在java.net包中定义了URL类,该类用来处理有关URL的内容。URL类需要参数String完成URL实例化,这里的address格式应满足URL的格式:为protocol://资源地址
- protocol可以是HTTP、HTTPS、FTP 和 File
- 资源地址中可以带有端口号及查询参数。
URL类中封装有一个InputStream返回类型的openStream()方法,我们的程序就可以读取这些字节输入流来获得对应内容。
输出到console测试
String address = "https://www.baidu.com";
try {
URL url = new URL(address);
System.out.printf("连接%s成功!", address);
//获得url的字节流输入
InputStream in = url.openStream();
//装饰成字符输入流
br = new BufferedReader(new InputStreamReader(in, "utf-8"));
} catch (IOException e) {
System.out.println("Invalid url!");
e.printStackTrace();
}
new Thread(() -> {
String message = null;
do {
try {
message = br.readLine();
System.out.println(message);
} catch (IOException e) {
e.printStackTrace();
}
} while (message != null);
System.out.println("The dialog has been closed");
}).start();
保存到文件核心代码:
File saveFile = new File(fileName);
FileOutputStream fileOut = new FileOutputStream(saveFile);//新建本地空文件
byte[] buf = new byte[1024]; // 用来缓存接收的字节数据
//获得url的字节流输入
URL url = new URL(address);
InputStream in = url.openStream();
int size = 0;
while ((size = in.read(buf)) != -1) { //读一块到缓存,读取结束返回-1 读取字节流保存到buf中
fileOut.write(buf, 0, size); //写一块到文件
}
fileOut.flush();//关闭前将缓存的数据全部推出
//文件传输完毕,关闭流
fileOut.close();