看后面的圖
package IOTest;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
*
* 檔案分割下載
*
*/
public class SplitFile {
private File source; //檔案源頭
private String desFile; //檔案保存的目的地檔案夾
private List<String> destPath; //所有分割后的檔案所保存的路徑
private int eachBlockSize; //每一塊的大小
private int sizeNum; //總共多少塊
public SplitFile(String path, String desFile, int eachBlockSize)
{
this.source = new File(path);
this.desFile = desFile;
this.eachBlockSize = eachBlockSize;
this.destPath = new ArrayList<String>();
init();
}
private void init() //初始化
{
long len = this.source.length(); //檔案總長度
this.sizeNum = (int)Math.ceil(len*1.0 / eachBlockSize); //計算總塊數,注意小數點
for(int i = 0;i < sizeNum; i++)
{
this.destPath.add(this.desFile + "/" + i + "-" + this.source.getName()); //完成所有分割后的檔案所保存的路徑
}
}
public void split() throws IOException //分割檔案,首先計算每一塊檔案的起始位置
{
long len = this.source.length();
int beginPos = 0; //起始位置
int actualSize = (int)(eachBlockSize > len ? len:eachBlockSize);
for(int i = 0;i < sizeNum;i++)
{
beginPos = i * eachBlockSize;
if(i == sizeNum - 1) //到了最后一塊
actualSize = (int)len;
else
{
actualSize = eachBlockSize;
len -= actualSize; //剩余還沒讀取的量
}
splitDetail(i,beginPos,actualSize);
}
}
private void splitDetail(int i, int beginPos, int actualSize) throws IOException {
RandomAccessFile randomAccessFile1 = new RandomAccessFile(this.source,"r");
RandomAccessFile randomAccessFile2 = new RandomAccessFile(this.destPath.get(i),"rw");
randomAccessFile1.seek(beginPos); //讀取
byte[] flush = new byte[1024]; //緩沖容器
int len = -1; //接收長度
while((len = randomAccessFile1.read(flush)) != -1) //read方法回傳讀取的資料量
{
if(actualSize > len) //若剩下的資料量大于這一次接收的量
{
randomAccessFile2.write(flush,0,len);
actualSize -= len;
}
else
{
randomAccessFile2.write(flush,0,actualSize);
break;
}
}
randomAccessFile1.close();
randomAccessFile2.close();
}
public void merge(String desFile) throws IOException {
OutputStream out = new BufferedOutputStream(new FileOutputStream(desFile,true));
for(int i=0;i < this.destPath.size();i++)
{
InputStream in = new BufferedInputStream(new FileInputStream(destPath.get(i)));
byte[] flush = new byte[1024];
int len = -1;
while((len=in.read(flush)) != -1)
{
out.write(flush,0,len);
}
out.flush();
in.close();
}
out.close();
}
public static void main(String[] args) throws IOException {
SplitFile splitFile = new SplitFile("src/IOTest/SplitFile.java","src",1024);
splitFile.split();
splitFile.merge("outer.java");
}
}
為什么0號檔案與其他3個檔案都不同?而且運行完以后IOTEST里的主類直接紅線了,提示Cannot resolve method......


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/152101.html
標籤:Java SE
下一篇:java編程
