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();
}
}
} |