Android开发之合并文件的几种方式

        以下介绍合并文件的几种方式,并通过合并amr文件来举例介绍合并文件的详细流程。amr格式的文件头是6字节,所以在进行文件合并的时候要减去除第一个文件以外的其它文件的文件头。

注意:不同文件的文件头是不一样的,所以在合并的时候依据不同文件对应的减去合并文件的文件头。

步骤一:获取要合并的文件及创建合并后保存的文件

/**用于存放要合并的文件的集合**/
List<File>tempFiles=new ArrayList<File>();
/**合并之后的文件**/
File finalFile;
	/*** 创建用于合并之后的文件* @param isTempFile 是否为暂时文件* @return soundFile File* */private File getFile(boolean isTempFile) {// TODO Auto-generated method stub		finalFile=null;if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {Log.w("Waring", "检測到你的手机没有插入SD卡,请插入SD后再试!");}		//获取系统的24小时制时间作为文件名称(HH为24小时制,hh为12小时制)SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss",Locale.getDefault());		String fileName=simpleDateFormat.format(new Date())+".amr";	if (isTempFile) {//假设是暂时文件fileName="temp"+fileName;}try {File parentFile= new File(Environment.getExternalStorageDirectory().getCanonicalFile()+"/"+"Recorder");if (!parentFile.exists()||parentFile==null) {//假设文件夹不存在parentFile.mkdirs();//创建parentFile文件夹}finalFile=new File(parentFile, fileName);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}			return finalFile;	}

步骤二:合并文件

方式一: 通过FileOutputStream、与FileInputStream方式

	/*** 通过FileOutputStream、与FileInputStream方式* 将多个文件进行合并,并删除原文件* */public void mergeFiles1() {// TODO Auto-generated method stubif (tempFiles.isEmpty()) return;//假设还没录制则,不进行合并File realFile=getFile(false);try {FileOutputStream fos=new FileOutputStream(realFile);		for (int i = 0; i < tempFiles.size(); i++) {//遍历tempFiles集合,合并全部暂时文件				FileInputStream fis=new FileInputStream(tempFiles.get(i));byte[] tmpBytes = new byte[fis.available()];int length = tmpBytes.length;//文件长度//头文件if(i==0){while(fis.read(tmpBytes)!=-1){fos.write(tmpBytes,0,length);}}					//之后的文件,去掉头文件就能够了.amr格式的文件的头信息为 6字节else{while(fis.read(tmpBytes)!=-1){						fos.write(tmpBytes,6,length-6);}}				fos.flush();fis.close();		}fos.close();//全部的文件合并结束,关闭输出流Log.i("info", "此次录音文件:"+realFile.getName()+" 已保存到:"+realFile.getAbsolutePath()+"文件夹下");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}//删除合并过的暂时文件for (File file:tempFiles) {if (file.exists()) {file.delete();}}}

方式二: 通过FileChannel方式

	/*** 通过FileChannel方式* */public void mergeFiles2() {File realFile=getFile(false);FileChannel mFileChannel;try {FileOutputStream fos=new FileOutputStream(realFile);			mFileChannel=fos.getChannel();		FileChannel inFileChannel;for(File file:tempFiles){             inFileChannel=new FileInputStream(file).getChannel();//以下应该依据不同文件减去对应的文件头(这里没有剪去文件头,实际应用中应当减去)inFileChannel.transferTo(0, inFileChannel.size(), mFileChannel);	             inFileChannel.close();}       fos.close();mFileChannel.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}

方式三:通过RandomAccessFile方式

	/*** 通过RandomAccessFile方式* */public void mergeFiles3() {try{				File realFile=getFile(false);FileOutputStream fos = new FileOutputStream(realFile);RandomAccessFile ra = null;for (int i = 0; i < tempFiles.size(); i++) {		    	ra = new RandomAccessFile(tempFiles.get(i), "r");if (i != 0) {ra.seek(6);//跳过amr文件的文件头}byte[] buffer = new byte[1024 * 8];int len = 0;while ((len = ra.read(buffer)) != -1) {fos.write(buffer, 0, len);}}ra.close();fos.close();} catch (Exception e) {e.printStackTrace();}		}


转载于:https://www.cnblogs.com/mengfanrong/p/4040069.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数组中出现次数超过一半的数

数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2限制&#xff1a; 1 < 数组长度 < 50000class Solution { pub…

中国寒龙反网络病毒联盟核心小组:官方公告,近期本站将会发布各种编程技术视频教程,详情请点击我们的以下公告!...

大家好&#xff0c;我是中国寒反网络病毒联盟官方客服&#xff01; 近期&#xff0c;本站将全面升级&#xff0c;本站发布各种编程视频教程&#xff0c;包括C,c#以及VB&#xff0c;VB.net&#xff0c;E&#xff0c;等相关编程语言入门视频教程&#xff0c;每天会定期更新视频教…

javascript学习-原生javascript的小特效(多个运动效果整理)

以下代码就不详细解析了&#xff0c;在我之前的多个运动效果中已经解析好多次了&#xff0c;重复的地方这里就不说明了&#xff0c;有兴趣的童鞋可以去看看之前的文章《原生javascript的小特效》 <!DOCTYPE HTML> <html lang"en-US"> <head> <m…

linux在指定目录多个文件中搜索关键字

find 文件目录 -name *.* -exec grep xxx {} -n\;# -n显示行号find 文件目录 -name *.* | xargs grep xxx -ngrep xxx 文件目录 -Rngrep xxx find 文件目录 -name *.*

$ npm install opencv ? 你试试?! 在windows环境下,使用node.js调用opencv攻略

博主之前写过一篇文章《html5与EmguCV前后端实现——人脸识别篇》&#xff0c;叙述的是opencv和C#的故事。最近在公司服务器上更新了一套nodejs环境&#xff0c;早就听闻npm上有opencv模块&#xff0c;便欲部署之。然而opencv的部署似乎从来都不会那么顺利...... 找模块上https…

android学习——GestureDetector.OnGestureListener 详解

Android Touch Screen 与传统Click Touch Screen不同&#xff0c;会有一些手势(Gesture)&#xff0c;例如Fling&#xff0c;Scroll等等。这些Gesture会使用户体验大大提升。Android中的Gesture识别(detector)是通过GestureDetector.OnGestureListener接口实现的。 首先&#xf…

关于安卓一键分享的,急求帮助!

问题描述现在要做一个项目&#xff0c;设置里面点击一个按钮就可以分享&#xff0c;有三个分享平台&#xff0c;新浪微博&#xff0c;微信和微信朋友圈现在的问题是我要在三个平台分享的内容不同&#xff0c;在新浪微博中分享的是一段文字叙述和一个网页链接&#xff1b;而在微…

和可被 K 整除的子数组

给定一个整数数组 A&#xff0c;返回其中元素之和可被 K 整除的&#xff08;连续、非空&#xff09;子数组的数目。 示例&#xff1a; 输入&#xff1a;A [4,5,0,-2,-3,1], K 5 输出&#xff1a;7 解释&#xff1a; 有 7 个子数组满足其元素之和可被 K 5 整除&#xff1a;…

前端进阶路线图

CSS不能编程&#xff1f;用Less、Sass、Stylus、甚至直接用 Absurd&#xff0c;框架除了Bootstrap还有很多。JS写多了很麻烦&#xff1f;jQuery。移动开发&#xff1f;Zepto.js。结构不好&#xff1f;找框架&#xff0c;Backbone.js是MVC&#xff0c;AngularJS和Ember.js是MVVM…

流媒体直播服务LSS

流媒体直播服务LSS posted on 2014-10-22 11:23 实验室 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/labs/p/4042641.html

Win7安装vs2010失败

提示&#xff1a; --------------------------------------------------------------------------------------------------------------------------------------- 解决方法&#xff1a;开始运行中regedit打开注册表找到HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control …

调光设备术语:调光曲线(转)

源&#xff1a;调光设备术语&#xff1a;调光曲线 核心提示&#xff1a;调光曲线是调光设备重要的参数之一&#xff0c;它直接影响到了灯光输出的效果&#xff0c;是数字化调光设备性能的体现。上面这句话包含了三点内容&#xff0c;我们逐条解析。 调光曲线是调光设备重要的参…

深入浅出理解QTimeLine类

网上找了下QTimeLIne类的介绍&#xff0c;要么就是代码一贴自己看去&#xff0c;要么就是说不到重点&#xff0c;正巧自己项目遇到这个类&#xff0c;在这里写一下&#xff0c;给需要的同学看下。 因为我最近需要有动画方面配合时间间隔触发QGraphicsView框架的需求&#xff0c…

0909编译原理

1.编译原理学什么&#xff1f; 编译原理是计算机专业的一门重要专业课&#xff0c;旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 2.为什么学编译原理&#xff1f; 这门…

何为动态绑定(转)

动态绑定只是叫法不同&#xff0c;你可以理解为多态&#xff01;例如&#xff0c;有一个抽像fruit水果父类&#xff0c;其中定义了一个方法抽像eat方法&#xff0c;而apple继承fruit并实现fruit的eat方法&#xff0c;而banana继承fruit并实现fruit的eat方法&#xff0c;外部调用…

继承与多态

第十七讲 A&#xff09;构造方法的重载&#xff1a;只需看参数即可。如果想在一个构造方法中调用另外一个构造方法&#xff0c;那么可以用this()的方式调用&#xff0c;this()括号中的参数表示目标构造方法的参数。this()必须要作为构造方法的第一条语句。 B&#xff09;继承&a…

c++学习心得

c是大一开始接触的一门新的语言&#xff0c;说老实话当时学的并不好兴趣指数5颗星中只有3颗。但是既然是学这方面的&#xff0c;还是好好听课学习吧。下面简单的说一下c的一些学习心得吧&#xff01; c是什么&#xff1f;c是一种面向对象的程序设计语言。c是c的一种提高&#x…

实现strstr()

实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串&#xff0c;在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在&#xff0c;则返回 -1。 示例 1: 输入: haystack "hello", needle "ll" 输出: 2示例…

有效电话号码

给定一个包含电话号码列表&#xff08;一行一个电话号码&#xff09;的文本文件 file.txt&#xff0c;写一个 bash 脚本输出所有有效的电话号码。 你可以假设一个有效的电话号码必须满足以下两种格式&#xff1a; (xxx) xxx-xxxx 或 xxx-xxx-xxxx。&#xff08;x 表示一个数字…

JSP中RequestDispatcher的用法

RequestDispatcher是一个Web资源的包装器&#xff0c;可以用来把当前request传递到该资源&#xff0c;或者把新的资源包括到当前响应中。RequestDispatcher接口中定义了两个方法&#xff1a;include/forward 由于<jsp:include>只能指定固定的jsp文件名&#xff0c;不能动…