Android 大文件切割與合并的實現(xiàn)代碼
前言:
由于公司的業(yè)務(wù),硬生生的把ios開發(fā)的我,掰成了android!關(guān)于上傳文件的需求處理,做了一個Java的簡單封裝 DocumentManagement 。其中集成了,檢測文件,MD5加密,Base64加密/解碼,針對文件Base64加密處理,獲取文件后戳,切割文件,合并文件等方法。
親測可切割與合并有效:視頻、mp3、jpg、apk!還有很多沒測,講道理應(yīng)該是都可以的。合并效果如圖:

好了不扯皮了,直接上代碼!注:以下代碼僅供參考,如有想法請留言告知 DocumentManagement 使用方法如下:
//文件
File file = new File(strPath);
documentManagement.log("開始——汪汪汪汪");
//切割文件
documentManagement.getSplitFile(file,1*1024*1024 );
//合并文件
String merFileName = "gsplay";//自定義合并文件名字
//創(chuàng)建合并文件路徑
String filePath = Environment.getExternalStorageDirectory().getPath()+"/"+merFileName;
documentManagement.merge(filePath,file,1*1024*1024);
documentManagement.log("結(jié)束——汪汪汪汪");
Java獲取文件后綴
/**
* 獲取文件后綴名 例如:.mp4 /.jpg /.apk
* @param file 指定文件
* @return String 文件后綴名
*/
public static String suffixName (File file){
String fileName=file.getName();
String fileTyle=fileName.substring(fileName.lastIndexOf("."),fileName.length());
return fileTyle;
}
文件按設(shè)定的大小進行切割
/**
* 文件分割方法
* @param targetFile 分割的文件
* @param cutSize 分割文件的大小
* @return int 文件切割的個數(shù)
*/
public static int getSplitFile(File targetFile ,long cutSize ) {
//計算切割文件大小
int count = targetFile.length() % cutSize == 0 ? (int) (targetFile.length() / cutSize) :
(int) (targetFile.length() / cutSize + 1);
RandomAccessFile raf = null;
try {
//獲取目標(biāo)文件 預(yù)分配文件所占的空間 在磁盤中創(chuàng)建一個指定大小的文件 r 是只讀
raf = new RandomAccessFile(targetFile, "r");
long length = raf.length();//文件的總長度
long maxSize = length / count;//文件切片后的長度
long offSet = 0L;//初始化偏移量
for (int i = 0; i < count - 1; i++) { //最后一片單獨處理
long begin = offSet;
long end = (i + 1) * maxSize;
offSet = getWrite(targetFile.getAbsolutePath(), i, begin, end);
}
if (length - offSet > 0) {
getWrite(targetFile.getAbsolutePath(), count-1, offSet, length);
}
} catch (FileNotFoundException e) {
// System.out.println("沒有找到文件");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return count;
}
/**
* 指定文件每一份的邊界,寫入不同文件中
* @param file 源文件地址
* @param index 源文件的順序標(biāo)識
* @param begin 開始指針的位置
* @param end 結(jié)束指針的位置
* @return long
*/
public static long getWrite(String file,int index,long begin,long end ){
long endPointer = 0L;
String a=file.split(suffixName(new File(file)))[0];
try {
//申明文件切割后的文件磁盤
RandomAccessFile in = new RandomAccessFile(new File(file), "r");
//定義一個可讀,可寫的文件并且后綴名為.tmp的二進制文件
//讀取切片文件
File mFile = new File(a + "_" + index + ".tmp");
//如果存在
if (!isFileExist(mFile)) {
RandomAccessFile out = new RandomAccessFile(mFile, "rw");
//申明具體每一文件的字節(jié)數(shù)組
byte[] b = new byte[1024];
int n = 0;
//從指定位置讀取文件字節(jié)流
in.seek(begin);
//判斷文件流讀取的邊界
while ((n = in.read(b)) != -1 && in.getFilePointer() <= end) {
//從指定每一份文件的范圍,寫入不同的文件
out.write(b, 0, n);
}
//定義當(dāng)前讀取文件的指針
endPointer = in.getFilePointer();
//關(guān)閉輸入流
in.close();
//關(guān)閉輸出流
out.close();
}else {
//不存在
}
} catch (Exception e) {
e.printStackTrace();
}
return endPointer - 1024;
}
文件合并
/**
* 文件合并
* @param fileName 指定合并文件
* @param targetFile 分割前的文件
* @param cutSize 分割文件的大小
*/
public static void merge(String fileName,File targetFile ,long cutSize) {
int tempCount = targetFile.length() % cutSize == 0 ? (int) (targetFile.length() / cutSize) :
(int) (targetFile.length() / cutSize + 1);
//文件名
String a=targetFile.getAbsolutePath().split(suffixName(targetFile))[0];
RandomAccessFile raf = null;
try {
//申明隨機讀取文件RandomAccessFile
raf = new RandomAccessFile(new File(fileName+suffixName(targetFile)), "rw");
//開始合并文件,對應(yīng)切片的二進制文件
for (int i = 0; i < tempCount; i++) {
//讀取切片文件
File mFile = new File(a + "_" + i + ".tmp");
//
RandomAccessFile reader = new RandomAccessFile(mFile, "r");
byte[] b = new byte[1024];
int n = 0;
//先讀后寫
while ((n = reader.read(b)) != -1) {//讀
raf.write(b, 0, n);//寫
}
//合并后刪除文件
isDeleteFile(mFile);
//日志
log(mFile.toString());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
DocumentManagement_Dome_Git下載地址
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
android自動生成dimens適配文件的圖文教程詳解(無需Java工具類)
這篇文章主要介紹了android自動生成dimens適配文件,無需Java工具類,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
Android 開發(fā)之dataBinding與ListView及事件
這篇文章主要介紹了Android 開發(fā)之dataBinding與ListView及事件的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-10-10
Flutter 底部彈窗ModelBottomSheet的使用示例
在實際開發(fā)過程中,經(jīng)常會用到底部彈窗來進行快捷操作,例如選擇一個選項,選擇下一步操作等等。在 Flutter 中提供了一個 showModelBottomSheet 方法用于彈出底部彈窗,本篇介紹如何使用底部彈窗。2021-06-06
Flutter中跨組件數(shù)據(jù)傳遞的方法總結(jié)
Flutter中的數(shù)據(jù)傳遞一般包括:父->子,子->父,父->父,也就是說嵌套時的傳遞以及跨頁面的傳遞,本文整理了三種我們通常使用的方法,需要的可以參考一下2023-06-06
Android TextView設(shè)置不同的顏色字體
這篇文章主要為大家詳細介紹了Android TextView設(shè)置不同的顏色字體,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12
Android中使用Gson解析JSON數(shù)據(jù)的兩種方法
Json是一種類似于XML的通用數(shù)據(jù)交換格式,具有比XML更高的傳輸效率;本文將介紹兩種方法解析JSON數(shù)據(jù),需要的朋友可以參考下2012-12-12

