多个线程复制视频文件,求助师哥师姐们

像海一样的人 2012-11-02 03:09:55
多个线程复制视频文件源程序如下:
package com.qimenguigu.lesson420121024.lesson10;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.RandomAccessFile;

/**
* @author Administrator
*
*/
public class Test1 implements Runnable {

// 来源文件
private String sourceFileName;
// 目标文件
private String targetFileName;
// 分块总数
private int blockCount;
// 开始COPY的块序号
private int blockNo;
// 缓存大小
private int maxBuffSize = 1024;

public Test1(String sourceFileName, String targetFileName, int blockCount,
int blockNo) {
this.sourceFileName = sourceFileName;
this.targetFileName = targetFileName;
this.blockCount = blockCount;
this.blockNo = blockNo;
}

public void run() {
// 得到来源文件
File file = new File(sourceFileName);
// 得到来源文件的大小
long size = file.length();
// 根据文件大小及分块总数算出单个块的大小
//System.out.println(size);
long blockLenth = size / blockCount;
// 算出当前开始COPY的位置
long startPosition = blockLenth * blockNo;
//System.out.println(startPosition);
// 实例化缓存

byte[] buff = new byte[maxBuffSize];
try {
// 从源文件得到输入流
InputStream inputStream = new FileInputStream(sourceFileName);
// 得到目标文件的随机访问对象
RandomAccessFile raf = new RandomAccessFile(sourceFileName, "rw");
RandomAccessFile waf = new RandomAccessFile(targetFileName, "rw");
// 将目标文件的指针偏移至开始位置
raf.seek(startPosition);
System.out.println(startPosition);
// 当前读取的字节数
int curRedLength=0;
// 累计读取字节数的和
int totalRedLength = 0;
// 将来源文件的指针偏移至开始位置
inputStream.skip(startPosition);
// 依次分块读取文件
//System.out.println(raf.read());
while ((curRedLength = raf.read(buff)) > 0
&& totalRedLength < blockLenth) {
System.out.println(buff);
//System.out.println("第"+blockNo+"次");
// 将缓存中的字节写入文件?目标文件中
waf.write(buff, 0, curRedLength);
// 累计读取的字节数
totalRedLength += curRedLength;
}
// 关闭相关资源
raf.close();
waf.close();
inputStream.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}

public static void main(String[] args) {

for (int i = 0; i < 4; i++) {//四个线程读,分四块
String source="e:/1/23.avi";
String toPath="e:/1/21.avi";
Test1 t = new Test1(source, toPath, 4, i);
Thread th=new Thread(t);
th.start();

}
}

}
整个代码的思路:为了充分利用线程,一个任务多个人做的优点,我把要读的视频文件分成四块,各自用一个线程来分别负责一块进行读写
问题描述:复制的那个视频文件只有源文件的四分之一,如果把要读的文件换成文本文件的话,四个线程读取的内容完全一样而且内容是四块文件中最后一块文件,最后的结果是:复制的文件有四分最后一块的内容,也就是第四个线程读取的内容
...全文
111 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaoqiulin_beijing 2012-11-02
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20090320/21/1e1023ce-1236-4123-9b32-a37655f1347d.html
楼主看看这篇文章、应该是多个线程共用一个流才可以提高效率
BadPattern 2012-11-02
  • 打赏
  • 举报
回复
我有一口井,只有一个水桶用来打水,十个人来打水和一个人来打水效率有区别么。
gaoqiulin_beijing 2012-11-02
  • 打赏
  • 举报
回复
楼主,我复制了一个rmvb的文件和一个文本文件,结果都是1/4

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧