import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
/**
* 一个线程处理文件写入
* @author app
*
*/
class Download extends Thread {
// 定义字节数组(取水的竹筒)的长度
private final int BUFF_LEN = 32;
// 定义下载的起始点
private long start;
// 定义下载的结束点
private long end;
// 下载资源对应的输入流
private InputStream is;
// 将下载的字节输出到raf中
private RandomAccessFile raf;
public Download() {
}
public Download(long start, long end, InputStream is, RandomAccessFile raf) {
System.out.println(start + "---------->" + end);
this.start = start;
this.end = end;
this.is = is;
this.raf = raf;
}
@Override
public void run() {
try {
is.skip(start); //因为流的大小每次都一样,所以每次读取的位置不一样,即跳过之前线程读取过的字节
raf.seek(start); //因为是往同一个文件写 所以每个线程写的位置不一样
// 定义读取输入流内容的缓存数组(竹筒)
byte[] buff = new byte[BUFF_LEN];
// 本线程负责下载资源的大小
long contentLen = end - start;
// 定义最多需要读取几次就可以完成本线程下载
long times = contentLen / BUFF_LEN + 4;
// 实际读取的字节
int hasRead = 0;
for (int i = 0; i < times; i++) {
hasRead = is.read(buff);
if (hasRead < 0) {
break;
}
raf.write(buff, 0, hasRead);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null)
is.close();
if (raf != null)
raf.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.URL;
import java.net.URLConnection;
/**
* 管理多个线程
* @author app
*
*/
public class MutilDown {
public static void main(String[] args) {
final int DOWN_THREAD_NUM = 4;
final String OUT_FILE_NAME = "d:/down.jpg";
InputStream[] isArr = new InputStream[DOWN_THREAD_NUM];
RandomAccessFile[] outArr = new RandomAccessFile[DOWN_THREAD_NUM];
try {
String str = "http://www.blueidea.com/articleimg/2006/08/3912/images/plant4.jpg";
str = "http://icon.nipic.com/block.gif";
URL url = new URL(str);
// 依次URL打开一个输入流
isArr[0] = url.openStream();
long fileLen = getFileLength(url);
System.out.println("网络资源的大小:" + fileLen);
outArr[0] = new RandomAccessFile(OUT_FILE_NAME, "rw");
for (int i = 0; i < fileLen; i++) {
outArr[0].write(0);
}
long numPerThred = fileLen / DOWN_THREAD_NUM;
// 整个下载资源整除后剩下的余数
long left = fileLen % DOWN_THREAD_NUM;
for (int i = 0; i < DOWN_THREAD_NUM; i++) {
// 为每条线程打开一条输入流,一个RandomAccessFile对象
// 让每个线程分别下载文件的不同部分
if (i != 0) {
// 以URL打开多个输入流
isArr[i] = url.openStream();
outArr[i] = new RandomAccessFile(OUT_FILE_NAME, "rw");
}
// 分别启动多个线程来下载网络资源
if (i == DOWN_THREAD_NUM - 1) {
// 最后一个线程下载指定numPerThred + left个字节
new Download(i * numPerThred, (i + 1) * numPerThred + left, isArr[i], outArr[i]).start();
} else {
// 每个线程负责下载一定的numPerThred个字节
new Download(i * numPerThred, (i + 1) * numPerThred, isArr[i], outArr[i]).start();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 定义获取指定网络资源的方法
public static long getFileLength(URL url) throws IOException {
long length = 0;
// 打开URL对应的URLConnection
URLConnection con = url.openConnection();
long size = con.getContentLength();
length = size;
return length;
}
}
分享到:
相关推荐
通过以上分析可以看出,利用Java多线程和Socket技术实现的断点续传下载不仅提高了下载效率,还增强了用户体验。这种技术方案适用于多种场景,特别是在网络条件不稳定的环境中,能够显著提升文件下载的成功率和用户...
Java多线程编程是Java开发中的核心话题,它涉及到线程的创建、同步、通信以及线程池等高级特性。在面试中,面试官常会询问候选人关于线程安全、死锁、活锁等问题,并要求应试者能够编写或分析并发代码。此外,算法...
根据给定的信息,我们可以从标题“mina多线程”、描述“mina java多线程开发框架 NIO”以及部分给出的内容中提炼出一系列与Mina框架相关的知识点。 ### Mina框架简介 Mina(Multipurpose Infrastructure Networked...
四.Java多线程 Java提供了强大的多线程支持。 4.1 如何创建线程?哪种好? - 可以通过继承Thread类或者实现Runnable接口来创建线程。 - 使用Executor框架来管理线程是更好的选择。 4.2 线程状态 - 线程有新建、...
8. Java Shared Data Toolkit (JSDT API) 则专注于多线程环境下共享数据的管理和同步,对于多媒体应用中的实时数据处理至关重要。 9. 其他如Java Telephony (JT) 和Java Speech API (JS API) 等,进一步扩展了Java...
4. **Java.nio**: 非阻塞I/O(New Input/Output)包提供了更高效的I/O操作,尤其适用于多线程和网络编程。`ByteBuffer`、`CharBuffer`等缓冲区类允许以块为单位进行数据传输,`Channels`接口和`Selectors`类支持选择...
- **ParNew垃圾收集器**:Serial的多线程版本,适用于多核CPU。 - **ParallelScavenge收集器**:追求高吞吐量,适用于后台任务。 - **SerialOld收集器**:单线程的标记整理算法,适用于客户端应用。 - **ParallelOld...
总的来说,Java Socket开发高并发小型服务器涉及到网络通信的基本原理、Java语言的网络编程接口、多线程技术以及服务器性能优化等多个方面,是Java开发者需要掌握的重要技能。通过深入理解和实践,开发者可以构建出...
总的来说,这些面试题涵盖了Java语言的核心特性,包括字符串处理、多线程、动态代理、序列化以及基本类型和封装类的区别。深入理解和掌握这些知识点对于成为一名合格的Java开发者至关重要。在实际面试中,候选人应该...
Java多线程是指在Java中同时执行多个线程的能力,每个线程都可以独立执行任务。Java的多线程支持使程序能够在执行其他任务的同时处理用户输入、网络请求等,提高了应用程序的响应速度和效率。多线程编程需要对共享...
标签"java supply5we"可能指的是这个过程是Java提供的标准库功能,适用于多种场景,而"supply5we"可能是项目或代码库的特定标记。 在实际应用中,我们可能会将这些操作封装到一个函数或类中,以便在不同地方复用。...
Java是一种广泛使用的面向对象的编程语言,其高级特性包括丰富的类库、强大的多线程支持以及高效的内存管理。以下是对给定题目中涉及的一些Java核心知识点的详细解释: 1. **流对象操作**:`flush()`和`close()`是...
系统设计人员需要熟悉网络编程、图形用户界面设计、多线程编程以及网络数据传输等关键Java技术。 8. 服务器端和客户端开发 在B/S架构的远程监测诊断系统中,服务器端需要负责处理数据采集、分析和逻辑运算等核心...
4. **环形缓冲区**:环形结构常用于实现环形缓冲,这是一种高效的数据传输机制,尤其适用于多线程环境。 5. **死锁**:在环形车道的交点,如果处理不当,可能会出现线程间的死锁,即两个或多个线程相互等待对方释放...
线程安全,适用于多线程环境下的字符串操作。 - **StringBuilder**:与StringBuffer类似,但非线程安全。在单线程环境下性能更高。 #### 十二、多态性 多态性是面向对象编程中的一个重要概念,它允许不同类的对象...
StringBuilder和StringBuffer线程安全地处理字符串连接,其中StringBuilder适合单线程环境,StringBuffer适用于多线程环境。两者的主要区别在于线程安全性。 Lambda表达式是Java 8引入的简洁语法,用于表示匿名函数...
- Java 1.4引入了New IO(NIO)框架,提供非阻塞I/O操作和通道(Channel)的概念,更适用于多线程和网络编程。虽然本报告主要讨论了基础的IO流,但了解NIO也是Java IO学习的重要部分。 总之,Java IO流是处理输入...
- Debug-mt:调试版本,多线程静态链接库,适用于多线程程序。 - Release:优化版本,不包含调试信息,适合在生产环境中使用。 - Release-mt:优化版本,多线程静态链接库,同样适用于多线程程序。 4. 运行时...
### Java多线程编程概念 多线程编程是Java并发处理的核心技术之一,可以显著提高程序的执行效率。 ### Java 创建一个线程 可以通过继承`Thread`类或实现`Runnable`接口来创建线程。 ### 线程的状态 Java中的线程有...
#### 二、并发与多线程 1. **创建线程的方式** - 继承`Thread`类 - 优点:简单直观。 - 缺点:Java不允许一个类继承多个类,因此这种方式限制了类的继承。 - 实现`Runnable`接口 - 优点:灵活,可以实现多个...