日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 文件分隔_java 实现大文件分隔成多个小文件

發(fā)布時間:2023/12/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 文件分隔_java 实现大文件分隔成多个小文件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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 當前塊的序號

* @return 現(xiàn)在拆分后塊的文件名

*/

private String generateSeparatorFileName(String fileAndPath,int currentBlock)//生成折分后的文件名,以便于將來合將

{

return fileAndPath+".part"+currentBlock;

}

/**

*

* @param fileAndPath 原文件及完整路徑

* @param fileSeparateName 文件分隔后要生成的文件名,與原文件在同一個目錄下

* @param blockSize 當前塊要寫的字節(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。