java 文件分隔_java 实现大文件分隔成多个小文件
public class FileTest {
/**
* 文件分隔器:給定文件的路徑和每一塊要拆分的大小,就可以按要求拆分文件
* 如果指定的塊給原文件都還要大,為了不動原文件,就生成另一個文件,以.bak為后綴,這樣可以保證原文件
* 如果是程序自動拆分為多個文件,那么后綴分別為".part序號",這樣就可以方便文件的合并了
* 原理:很簡單,就是利用是輸入輸出流,加上隨機文件讀取。
*/
String FileName=null;//原文件名
long FileSize=0;//原文件的大小
long BlockNum=0;//可分的塊數(shù)
/**
* @param fileAndPath 原文件名及路徑
*/
private void getFileAttribute(String fileAndPath)//取得原文件的屬性
{
File file=new File(fileAndPath);
FileName=file.getName();
FileSize=file.length();
}
/**
*
* @param blockSize 每一塊的大小
* @return 能夠分得的塊數(shù)
*/
private long getBlockNum(long blockSize)//取得分塊數(shù)
{
long fileSize=FileSize;
if(fileSize<=blockSize)//如果分塊的小小只夠分一個塊
return 1;
else {
if(fileSize%blockSize>0) {
return fileSize/blockSize+1;
} else
return fileSize/blockSize;
}
}
/**
*
* @param fileAndPath 原文件及完整路徑
* @param currentBlock 當(dāng)前塊的序號
* @return 現(xiàn)在拆分后塊的文件名
*/
private String generateSeparatorFileName(String fileAndPath,int currentBlock)//生成折分后的文件名,以便于將來合將
{
return fileAndPath+".part"+currentBlock;
}
/**
*
* @param fileAndPath 原文件及完整路徑
* @param fileSeparateName 文件分隔后要生成的文件名,與原文件在同一個目錄下
* @param blockSize 當(dāng)前塊要寫的字節(jié)數(shù)
* @param beginPos 從原文件的什么地方開始讀取
* @return true為寫入成功,false為寫入失敗
*/
private boolean writeFile(String fileAndPath,String fileSeparateName,long blockSize,long beginPos)//往硬盤寫文件
{
RandomAccessFile raf=null;
FileOutputStream fos=null;
byte[] bt=new byte[1024];
long writeByte=0;
int len=0;
try {
raf = new RandomAccessFile(fileAndPath,"r");
raf.seek(beginPos);
fos = new FileOutputStream(fileSeparateName);
while((len=raf.read(bt))>0) {
if(writeByte
{
writeByte=writeByte+len;
if(writeByte<=blockSize)
fos.write(bt,0,len);
else {
len=len-(int)(writeByte-blockSize);
fos.write(bt,0,len);
}
}
}
fos.close();
raf.close();
} catch (Exception e) {
e.printStackTrace();
try {
if(fos!=null)
fos.close();
if(raf!=null)
raf.close();
} catch(Exception f)
{
f.printStackTrace();
}
return false;
}
return true;
}
/**
* @param fileAndPath 原文路徑及文件名
* @param blockSize 要拆分的每一塊的大小
* @return true為拆分成功,false為拆分失敗
*/
private boolean separatorFile(String fileAndPath,long blockSize)//折分文件主函數(shù)
{
getFileAttribute(fileAndPath);//將文件的名及大小屬性取出來
//System.out.println("FileSize:"+FileSize);
//System.out.println("blockSize:"+blockSize);
BlockNum=getBlockNum(blockSize);//取得分塊總數(shù)
//System.out.println("BlockNum:"+BlockNum);
//System.exit(0);
if(BlockNum==1)//如果只能夠分一塊,就一次性寫入
blockSize=FileSize;
long writeSize=0;//每次寫入的字節(jié)
long writeTotal=0;//已經(jīng)寫了的字節(jié)
String FileCurrentNameAndPath=null;
for(int i=1;i<=BlockNum;i++)
{
if(i
writeSize=blockSize;//取得每一次要寫入的文件大小
else
writeSize=FileSize-writeTotal;
if(BlockNum==1)
FileCurrentNameAndPath=fileAndPath+".bak";
else
FileCurrentNameAndPath=generateSeparatorFileName(fileAndPath,i);
//System.out.print("本次寫入:"+writeSize);
if(!writeFile(fileAndPath,FileCurrentNameAndPath,writeSize,writeTotal))//循環(huán)往硬盤寫文件
return false;
writeTotal=writeTotal+writeSize;
//System.out.println("? 總共寫入:"+writeTotal);
}
return true;
}
public static void main(String[] args)
{
FileTest separator = new FileTest();
String fileAndPath="f://abc.txt";//文件名及路徑
long blockSize=200*1024;//每一個文件塊的大小,大小是按字節(jié)計算
if(separator.separatorFile(fileAndPath,blockSize)) {
System.out.println("文件折分成功!");
}
else {
System.out.println("文件折分失敗!");
}
}
}
總結(jié)
以上是生活随笔為你收集整理的java 文件分隔_java 实现大文件分隔成多个小文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 字节码对象_获得类的字节码对象
- 下一篇: win10内存占用率过高怎么解决