我有一个10GB的PDF文件,我希望将其分成10个文件,每个文件大小为1GB。我需要并行执行此操作,这意味着旋转10个线程,每个线程从不同的位置开始,读取1GB的数据并写入文件。基本上最终结果应该是10个文件,每个文件包含原始10GB文件的一部分。
我查看了FileChannel,但是该位置是共享的,所以一旦我在一个线程中修改位置,它就会影响另一个线程。我还查看了Java 7中的AsynchronousFileChannel,但我不确定这是否可行。我对此问题的任何建议表示赞赏。
我写了这个简单的程序,它读取一个小文本文件来测试FileChannel的想法,似乎不适用于我想要实现的目标。
package org.cas.filesplit;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
public class ConcurrentRead implements Runnable {
private int myPosition = 0;
public int getPosition() {
return myPosition;
}
public void setPosition(int position) {
this.myPosition = position;
}
static final String filePath = "C:\\Users\\temp.txt";
@Override
public void run() {
try {
readFile();
} catch (IOException e) {
e.printStackTrace();
}
}
private void readFile() throws IOException {
Path path = Paths.get(filePath);
FileChannel fileChannel = FileChannel.open(path);
fileChannel.position(myPosition);
ByteBuffer buffer = ByteBuffer.allocate(8);
int noOfBytesRead = fileChannel.read(buffer);
while (noOfBytesRead != -1) {
buffer.flip();
System.out.println("Thread - " + Thread.currentThread().getId());
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
System.out.println(" ");
buffer.clear();
noOfBytesRead = fileChannel.read(buffer);
}
fileChannel.close();
}
}