【Java基础之网络编程】代码库(七)
来源:互联网 发布:小型电动粉碎机淘宝网 编辑:程序博客网 时间:2024/05/21 03:55
单线程下载.java
/** * FileOutputStream 类创建输出流对象, 然后使用 write() 方法, 将从输入流获得的网络资源保存到磁盘上, 实现网络资源的单线程下载.**/public void download(String urlAddr) { try { URL url = new URL(urlAddr); //创建 url 对象 URLConnection urlConn = url.openConnection(); //打开 url 连接 urlConn.connect(); //连接 InputStream in = urlConn.getInputStream(); //获取字节流 String filePath = url.getFile(); //获取完整路径 int pos = filePath.lastIndexOf("/") //获得路径中最后一个斜杠的位置 String fileName = filePath.substring(pos + 1); //截取文件名 FileOutputStream out = new FileOutputStream("D:/" + fileName);//创建输出流对象 byte[] bt = new byte[1024]; //声明存放下载内容的字节数组 int len = in.read(bt); //从输入流中读取内容 while(len != -1) { out.write(bt, 0, len); //将读取的内容全部写入到输出流 len = in.read(bt); //继续从输入流中读取内容 } //关闭资源 out.close(); in.close(); } catch (Exception e) { e.printStackTrace(); }}//注意: 在网络下载时, 通常需要及时的关闭 I/O 流, 因为每个 I/O 流都会占用较多的系统资源, 且不能被垃圾回收机制回收, 当下载资源的用户较多时容易造成系统崩溃.
断点续传.java
public void download(long startPosition, long endPosition) { try { URL url = new URL(urlAddress); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //设置请求属性和范围 conn.setRequestProperty("User-Agent", "NetFox"); String rangeProperty = "bytes=" + startPosition + "-"; if (endPosition > 0) { rangeProperty += endPosition; } conn.setRequestProperty("RANGE", rangeProperty); conn.connect(); InputStream in = conn.getInputStream(); String file = url.getFile(); String name = file.substring(file.lastIndexOf("/") + 1); FileOutputStream out = new FileOutputStream("D:/" + name, true); byte[] buff = new byte[2048]; int len = 0; len = in.read(buff); while (len != -1) { out.write(buff, 0, len); len = in.read(buff); } out.close(); in.close(); conn.disconnect(); if ( readToPos > 0 && readToPos == totalLength ) { System.exit(0); } } catch (Exception e) { e.printStackTrace(); }}
多线程下载.java
public class DownloadMultiThread implements Runnable { private String sURL = null; private File desFile; private long startPos; private long endPos; public DownloadMultiThread() { } public DownloadMultiThread(String sURL, File desFile, long startPos, long endPos) { this.sURL = sURL; this.desFile = desFile; this.startPos = startPos; this.endPos = endPos; } public void run() { RandomAccessFile out = new RandomAccessFile(desFile, "rw"); out.seek(startPos); InputStream in = conn.getInputStream(); BufferedInputStream bin = new BufferedInputStream(in); byte[] buff = new byte[2048]; int len = -1; //读取到内存并添加到字节数组 len = bin.read(buff); while (len != -1) { out.write(buff, 0, len); len = bin.read(buff); } }}public void download(String url, String dest, int threadNum) throws Exception { URL downURL = new URL(url); HttpURLConnection conn = (HttpURLConnection)downURL.openConnection(); //打开网络连接 long fileLength = -1; int stateFlagCode = conn.getResponseCode(); //获得连续状态标记代码 //网络连接正常 if (stateFlagCode == 200) { fileLength = conn.getContentLength(); //获得文件的长度 conn.disconnect(); } if (fileLength > 0) { long byteCounts = fileLength / threadNum + 1; //计算每个线程的字节数 File file = new File(dest); int i = 0; while (i < threadNum) { //定义开始和结束位置 long startPosition = byteCounts * i; long endPosition = byteCounts * (i + 1); if (i == threadNum -1) { /* 创建 DownloadMultiThread 线程的实例 */ DownloadMultiThread fileThread = new DownloadMultiThread(url, file, startPosition, 0); new Thread(fileThread).start(); //启动一个线程对象 } else { DownloadMultiThread fileThread = new DownloadMultiThread(url, file, startPosition, endPosition); new Thread(fileThread).start(); //启动一个线程对象 } i++; } JOptionPane.showMessageDialog(null, "完成网络资源下载"); }}//注意: 使用多线程下载程序时, 由于创建线程是非常消耗资源的, 如果线程的创建较多, 将极大的影响系统性能, 这时可以使用线程池来提高系统系能, 当需要创建线程时, 可以从线程池中取出空闲线程, 从而提高多线程下载的系统性能.
获取网页内容.java
public Collection<String> getURLCollection(String urlString) { URL url = null; URLConnection conn = null; Collection<String> urlCollection = new ArrayList<String>(); try { url = new URL(); conn = url.openConnection(); conn.connect(); InputStream is = conn.getInputStream(); InputStreamReader isr = new InputStreamReader(is, "UTF-8"); BufferedReader br = new BufferedReader(isr); String nextLine = br.readLine(); //遍历读取网页的全部内容, 并添加到集合对象中 while (nextLine != null) { urlCollection.add(nextLine); nextLine = br.readLine(); } } catch (Exception e) { e.printStackTrace(); } return urlCollection;}
阅读全文
0 0
- 【Java基础之网络编程】代码库(七)
- Java学习笔记(七、网络编程基础)
- Java网络编程之基础
- java基础之 网络编程
- Java基础之网络编程
- JAVA基础之网络编程
- JAVA基础之网络编程
- java基础之网络编程
- java基础之-网络编程
- Java基础之网络编程
- java基础之 网络编程
- Java基础之网络编程
- java基础之网络编程 .
- Java基础之网络编程
- java基础之网络编程
- Java基础之网络编程
- java基础之网络编程
- java之网络编程基础
- java多线程详解(并发,并行,同步)
- 云笔记项目 Unit04
- LINUX环境下Nginx与php-fpm安装部署
- 压力测试-步骤
- 初级着色器
- 【Java基础之网络编程】代码库(七)
- Findbugs 缺陷详解与英文代号的对照表
- java读取properties文件
- 对象和封装
- Lvs+keepalived 实现高可用负载均衡文档
- WPF阴影效果
- 地图覆盖物(平面图、室内图)
- CentOS 安装 MySQL 5.7.18
- JSON解析