import java.io.*;
class DownThread extends Thread {
//定义字节数组(取水的竹筒)的长度
private final int BUFF_LEN = 32;
//定义读取的起始点
private long start;
//定义读取的结束点
private long end;
//读取文件对应的输入流
private InputStream is;
//将读取到的字节输出到raf中
private RandomAccessFile raf;
//构造器,传入输入流,输出流和读取起始点、结束点
public DownThread(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;
}
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);
//如果读取的字节数小于0,则退出循环!
if (hasRead < 0) {
break;
}
raf.write(buff, 0, hasRead);
}
} catch (Exception ex) {
ex.printStackTrace();
}
//使用finally块来关闭当前线程的输入流、输出流
finally {
try {
if (is != null) {
is.close();
}
if (raf != null) {
raf.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
public class MutilDown {
public static void main(String[] args) {
final int DOWN_THREAD_NUM = 4;
final String OUT_FILE_NAME = "d:/copy勇敢的心.rmvb";
InputStream[] isArr = new InputStream[DOWN_THREAD_NUM];
RandomAccessFile[] outArr = new RandomAccessFile[DOWN_THREAD_NUM];
try {
isArr[0] = new FileInputStream("d:/勇敢的心.rmvb");
long fileLen = getFileLength(new File("d:/勇敢的心.rmvb"));
System.out.println("文件的大小" + fileLen);
//以输出文件名创建第一个RandomAccessFile输出流
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) {
isArr[i] = new FileInputStream("d:/勇敢的心.rmvb");
//以指定输出文件创建多个RandomAccessFile对象
outArr[i] = new RandomAccessFile(OUT_FILE_NAME, "rw");
}
if (i == DOWN_THREAD_NUM - 1) {
//最后一个线程读取指定numPerThred+left个字节
new DownThread(i * numPerThred, (i + 1) * numPerThred
+ left, isArr[i], outArr[i]).start();
} else {
//每个线程负责读取一定的numPerThred个字节
new DownThread(i * numPerThred, (i + 1) * numPerThred,
isArr[i], outArr[i]).start();
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static long getFileLength(File file) {
long length = 0;
//获取文件的长度
long size = file.length();
length = size;
return length;
}
}
分享到:
相关推荐
本文将围绕“多线程读取文件”这一主题,结合给定的标签“源码”和“工具”,深入探讨如何在Java等编程语言中实现这一功能,并提供一些实用的工具和技巧。 首先,我们了解为什么需要多线程读取文件。当处理大型文件...
然后,在`file_lock.py`的2.1部分,展示了没有使用任何同步机制(即不加锁)的多线程读写文件。这会导致并发问题,如输出所示,数据被错误地读取和写入,因为多个线程可能同时访问文件,导致数据混乱。 为了修复这...
例如,一个单线程程序可能一次只能读取或发送文件的一个部分,而多线程程序则可以同时处理多个部分,大大加快了速度。 在实现多线程文件传输时,首先需要创建线程对象,每个线程负责处理文件的一部分。这通常涉及到...
"file_dw.rar_多线程 读写_文件 系统 dw"这个压缩包文件,从标题来看,似乎包含了一个关于如何在操作系统(可能是DW,可能是某个特定的操作系统代号或者开发环境)中使用多线程进行文件读写的示例或代码库。...
读文件费时间,所以开一个线程读文件。 抽象后的类似demo: 假定读文件需要0.6秒,图像处理(用存文件代替)需要0.5秒,各执行100次。 类和函数 读取文件函数: 一,List增加本序号(0开始)。 二,随机生成5000...
在C++编程中,多线程技术是一种提升程序性能的有效手段,特别是在文件传输场景中,通过并发执行多个任务,可以显著提高数据传输速度。本文将深入探讨如何利用C++实现多线程文件传输的设计与实现。 一、多线程基础 ...
Java使用多线程读取超大文件 Java使用多线程读取超大文件是指在java语言中使用多线程技术来读取超大文件,以提高读取速度和效率。下面是该技术的详细介绍和实现方法。 多线程读取超大文件的必要性 在读取超大文件...
在IT行业中,线程读写是多线程编程中的一个重要概念,特别是在处理文件操作时。当我们需要在多个线程中同时进行文件的读取和写入时,必须谨慎处理以防止数据冲突和不一致。本篇文章将深入探讨“File 线程读写”的...
本文将详细讲解如何利用C#实现文件的多线程复制,包括线程池的使用、线程数量限制以及FileStream类的读写功能。 首先,线程是操作系统分配CPU时间的基本单位,每个线程负责执行一个独立的任务。在C#中,我们可以...
在Android开发中,多线程、断点续传和同时下载多个大文件是优化用户体验和提高应用程序性能的关键技术。下面将详细阐述这些知识点,并提供如何实现的指导。 **多线程** 多线程是Android应用中处理耗时操作的重要...
在Java编程中,多线程随机读取文件是一项重要的技术,尤其在处理大数据或高并发场景时。"RandomAccessFile"是Java中的一个类,它提供了对文件进行随机访问的能力,允许程序在文件的任意位置读写数据,而不仅仅是顺序...
在"delphi多线程 读写数据"的场景中,TThread可以用来创建两个独立的线程,分别负责读取文件的两个部分,以实现并行读取,从而提升读取速度。 以下是使用TThread进行多线程读写的步骤: 1. **创建TThread子类**:...
在Java编程中,多线程读取多个文件是一项常见需求,尤其在文件数量较多或者文件较大时,能够提升处理效率。本文将详细介绍如何在Java中使用多线程来同时读取多个文件。 首先,本文涉及到的核心类是`Thread`类,这是...
实现多线程读取多个配置文件的步骤如下: 1. **配置文件加载**:在Java代码中,使用`PropertyConfigurator`或`DOMConfigurator`类动态加载配置文件。例如,`PropertyConfigurator.configure("path/to/config1....
通过使用读写锁,我们可以在保证多线程读取效率的同时,确保文件写入的线程安全。在上述的多线程写入文件示例中,如果没有使用读写锁,可能会导致部分日志无法正确写入。而使用了读写锁后,所有日志都能够正确地写入...
在C++编程中,日志(LOG)...总的来说,C++中的多线程日志系统设计涉及到文件操作、线程同步和错误处理等多个方面。通过合理的同步机制,我们可以构建一个可靠且高效的日志系统,为程序的维护和优化提供宝贵的信息。
在多线程环境下,需要确保线程安全地读取和写入文件,避免数据错乱。 5. **暂停与开始**:为了提供更好的用户体验,项目实现了文件传输的暂停和开始功能。这可能通过设置标志变量或使用信号量来控制线程的执行状态...
Java多线程文件分片下载实现的示例代码 本文将详细介绍Java多线程文件分片下载的实现示例代码,通过示例代码,大家可以学习和理解多线程文件分片下载的技术难点和解决方案。 多线程下载的技术难点 ---------------...