多线程切割文件

发布 : 2018-09-24 分类 : 后端 浏览 :

一、切割文件线程

SplitCallable.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

public class SplitCallable implements Callable<String> {

private static final Logger logger = LoggerFactory.getLogger(SplitCallable.class);

/**
* 分块大小
*/
private int byteSize;

/**
* 块文件名称
*/
private String partFileName;

/**
* 源文件
*/
private File sourceFile;

/**
* 开始位置
*/
private int startPos;

public SplitCallable(int byteSize, int startPos, String partFileName, File sourceFile) {
this.startPos = startPos;
this.byteSize = byteSize;
this.partFileName = partFileName;
this.sourceFile = sourceFile;
}

@Override
public String call() throws Exception {
RandomAccessFile randomAccessFile = null;
OutputStream outputStream = null;
String filePath = "";
try {
randomAccessFile = new RandomAccessFile(sourceFile, "r");
byte[] bytes = new byte[byteSize];
// 移动指针到指定位置
randomAccessFile.seek(startPos);
int s = randomAccessFile.read(bytes);
// 在同级目录输出
File file = new File(sourceFile.getParent(), partFileName);
filePath = file.getPath();
outputStream = new BufferedOutputStream(new FileOutputStream(file));
outputStream.write(bytes, 0, s);
outputStream.flush();
} catch (IOException e) {
logger.error(e.getMessage(), e);
} finally {
IOUtils.closeQuietly(outputStream);
}
return filePath;
}
}

二、调用过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

/**
* 线程池
*/
private static ExecutorService service = Executors.newFixedThreadPool(corePoolSize);

// 源文件
File file = new File(filePath);
// 需要切割的块的个数
int count = 10;
// 开始位置
int startPos = 0;
List<Future> futures = new ArrayList<>();
for (int i = 0; i < count; i++) {
// 需要切割的大小
int byteSize = getByteSize();
// 切割文件
Future<String> future = service.submit(new SplitCallable(byteSize, startPos, i + ".tmp", file));
futures.add(future);
// 更新偏移量
startPos += byteSize;
}

// 同步获取切割结果
for (Future future : futures) {
try {
logger.debug("切割后的文件路径:{}", future.get());
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}

三、测试结果

将1.5G的文件切割成20块,耗时7秒

本文作者 : tangyi
原文链接 : http://ehedgehog.com/2018/09/24/多线程切割文件/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

知识 & 情怀 | 二者兼得

支付宝扫一扫, 向我投食

支付宝扫一扫, 向我投食

留下足迹