Android 大文件切割与合并的实现代码
程序员文章站
2022-06-04 12:25:04
前言:
由于公司的业务,硬生生的把ios开发的我,掰成了android!关于上传文件的需求处理,做了一个java的简单封装 documentmanagement 。其中集...
前言:
由于公司的业务,硬生生的把ios开发的我,掰成了android!关于上传文件的需求处理,做了一个java的简单封装 documentmanagement 。其中集成了,检测文件,md5加密,base64加密/解码,针对文件base64加密处理,获取文件后戳,切割文件,合并文件等方法。
亲测可切割与合并有效:视频、mp3、jpg、apk!还有很多没测,讲道理应该是都可以的。合并效果如图:
好了不扯皮了,直接上代码!注:以下代码仅供参考,如有想法请留言告知 documentmanagement 使用方法如下:
//文件 file file = new file(strpath); documentmanagement.log("开始——汪汪汪汪"); //切割文件 documentmanagement.getsplitfile(file,1*1024*1024 ); //合并文件 string merfilename = "gsplay";//自定义合并文件名字 //创建合并文件路径 string filepath = environment.getexternalstoragedirectory().getpath()+"/"+merfilename; documentmanagement.merge(filepath,file,1*1024*1024); documentmanagement.log("结束——汪汪汪汪");
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; }
文件按设定的大小进行切割
/** * 文件分割方法 * @param targetfile 分割的文件 * @param cutsize 分割文件的大小 * @return int 文件切割的个数 */ 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 { //获取目标文件 预分配文件所占的空间 在磁盘中创建一个指定大小的文件 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 源文件的顺序标识 * @param begin 开始指针的位置 * @param end 结束指针的位置 * @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"); //申明具体每一文件的字节数组 byte[] b = new byte[1024]; int n = 0; //从指定位置读取文件字节流 in.seek(begin); //判断文件流读取的边界 while ((n = in.read(b)) != -1 && in.getfilepointer() <= end) { //从指定每一份文件的范围,写入不同的文件 out.write(b, 0, n); } //定义当前读取文件的指针 endpointer = in.getfilepointer(); //关闭输入流 in.close(); //关闭输出流 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"); //开始合并文件,对应切片的二进制文件 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下载地址
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 小程序实现自定义导航栏适配完美版