- 利用多线程读取文件,并写到另外一个文件
ReadWriteFile类,继承Runnable
package com.chbai.entity;
/***
* ReadWriteFile
*
* author: chbai
*/
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class ReadWriteFile implements Runnable{
private String source;
private String dest;
private int threadnum;
private int buflen = 1024 * 1024;
public ReadWriteFile(String source,String dest,int threadnum){
this.source = source;
this.dest = dest;
this.threadnum = threadnum;
}
@Override
public void run() {
int id = Integer.valueOf(Thread.currentThread().getName());
byte buffer[] = new byte[buflen];
try {
RandomAccessFile reader = new RandomAccessFile(source, "r");
RandomAccessFile writer = new RandomAccessFile(dest, "rw");
long alone = reader.length() % threadnum == 0 ? reader.length()
/ threadnum : ((int) (Math.ceil((double) reader.length()
/ threadnum)));
long begin = id * alone;
reader.seek(begin);
writer.seek(begin);
long end = (begin + alone) > reader.length() ? reader.length() : (begin + alone);
while (begin < end) {
int len = 0;
if (begin + buflen < end) {
len = reader.read(buffer);
} else {
len = reader.read(buffer, 0, (int) (end - begin));
}
writer.write(buffer, 0, len);
begin += len;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
BatchReadWriteFile类
package com.chbai.entity;
public class BatchReadWriteFile {
private int threadnum;
private String source;
private String dest;
private final static int THREAD_NUM = 5;
public BatchReadWriteFile(String source, String dest, int threadnum){
this.source = source;
this.dest = dest;
this.threadnum = (threadnum < 1) ? THREAD_NUM : threadnum;
}
public BatchReadWriteFile(String source, String dest){
this.source = source;
this.dest = dest;
this.threadnum = THREAD_NUM;
}
public void begin(){
for(int i = 0 ; i < threadnum; i++ ){
Thread thread = new Thread(new ReadWriteFile(source,dest,threadnum));
thread.setName(i+"");
thread.start();
}
}
}
BatchReadWriteFileTest类
package com.chbai.test;
import com.chbai.entity.BatchReadWriteFile;
public class BatchReadWriteFileTest {
public static void main(String[] args) {
BatchReadWriteFile batch = new BatchReadWriteFile("D:\\RUNNING.txt","D:\\RUNNING2.txt");
batch.begin();
}
}
ReadWriteFile类,继承Runnable
package com.chbai.entity;
/***
* ReadWriteFile
*
* author: chbai
*/
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class ReadWriteFile implements Runnable{
private String source;
private String dest;
private int threadnum;
private int buflen = 1024 * 1024;
public ReadWriteFile(String source,String dest,int threadnum){
this.source = source;
this.dest = dest;
this.threadnum = threadnum;
}
@Override
public void run() {
int id = Integer.valueOf(Thread.currentThread().getName());
byte buffer[] = new byte[buflen];
try {
RandomAccessFile reader = new RandomAccessFile(source, "r");
RandomAccessFile writer = new RandomAccessFile(dest, "rw");
long alone = reader.length() % threadnum == 0 ? reader.length()
/ threadnum : ((int) (Math.ceil((double) reader.length()
/ threadnum)));
long begin = id * alone;
reader.seek(begin);
writer.seek(begin);
long end = (begin + alone) > reader.length() ? reader.length() : (begin + alone);
while (begin < end) {
int len = 0;
if (begin + buflen < end) {
len = reader.read(buffer);
} else {
len = reader.read(buffer, 0, (int) (end - begin));
}
writer.write(buffer, 0, len);
begin += len;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
BatchReadWriteFile类
package com.chbai.entity;
public class BatchReadWriteFile {
private int threadnum;
private String source;
private String dest;
private final static int THREAD_NUM = 5;
public BatchReadWriteFile(String source, String dest, int threadnum){
this.source = source;
this.dest = dest;
this.threadnum = (threadnum < 1) ? THREAD_NUM : threadnum;
}
public BatchReadWriteFile(String source, String dest){
this.source = source;
this.dest = dest;
this.threadnum = THREAD_NUM;
}
public void begin(){
for(int i = 0 ; i < threadnum; i++ ){
Thread thread = new Thread(new ReadWriteFile(source,dest,threadnum));
thread.setName(i+"");
thread.start();
}
}
}
BatchReadWriteFileTest类
package com.chbai.test;
import com.chbai.entity.BatchReadWriteFile;
public class BatchReadWriteFileTest {
public static void main(String[] args) {
BatchReadWriteFile batch = new BatchReadWriteFile("D:\\RUNNING.txt","D:\\RUNNING2.txt");
batch.begin();
}
}