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 block
			e.printStackTrace();
		}
		return finalFile;
	}

步骤二:合并文件

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

	/**
	 * 通过FileOutputStream、与FileInputStream方式
	 * 将多个文件进行合并,并删除原文件
	 * */
	public void mergeFiles1() {
		// TODO Auto-generated method stub
		if (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 block
			e.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 block
			e.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();
		  }
	}

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

时间: 2024-10-23 23:21:51

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

Android合并文件的三种方式代码

amr格式的文件头是6字节,在进行文件合并的时候要减去除第一个文件以外的其他文件的文件头.下面介绍合并文件的几种方式,并通过合并amr文件来举例介绍合并文件的具体流程. 注意:不同文件的文件头是不一样的,所以在合并的时候根据不同文件相应的减去合并文件的文件头.具体你可以学习Android开发教程. 步骤一:获取要合并的文件及创建合并后保存的文件 /**用于存放要合并的文件的集合**/List<File>tempFiles=new ArrayList<File>();/**合并之后的

Android开发之数据存储的四种方式之SharedPreferences

Android项目开发中使用的数据存储方式有:网络存储.sqlite存储.File存储和SharedPreferences存 储,四种存储方式对应的Demo别人是NetworkDemo.SqliteDemo.FileDemo和SharedPreferencesDemo, 根据应用的场景选择其中一种或多种方式,比如在登录界面验证,需要将用户名和密码通过SharedPreferences方式保存,注册信息的时候需要通 过网络将数据存储到后台数据库中.结合一个登录界面的验证,使用SharedPrefe

Android开发之下载文件

Android开发中,文件下载时必须的,在此总结一下. Android文件下载需要的准备工作:1.联网和读写SD卡的权限设置:2.HttpURLConnection的使用知识:3.流式操作读写文件的知识. 以下是我自己写的示例代码,用以理解Android文件下载. 1.AndroidMainfest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="ht

【转】Android开发学习笔记:5大布局方式详解

Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件. 帧布局(FrameLayout):组件从屏幕左上方布局组件. 表格布局(TableLayout):按照行列方式布局组件. 相对布局(RelativeLayout):相对其它组件的布局方式. 绝对布局(AbsoluteLayout):按照绝对坐标来布局组件. 1. 线性布局 线性布局是Android开发中最常见的一种布局方式,它是按照垂直或者水平方向来布局,通过“android:

C#中的Excel操作【1】——设置Excel单元格的内容,打开Excel文件的一种方式

前言 作为项目管理大队中的一员,在公司里面接触最多的就是Excel文件了,所以一开始就想从Excel入手,学习简单的二次开发,开始自己的编程之路! 程序界面 功能说明 打开文件按钮,可以由使用者指定要操作的Excel文件,并在后面的textBox中显示出文件路径. 设置单元格按钮,可以根据程序设置Excel文件的内容. 退出程序按钮,关闭窗体. 程序源代码 1 using System; 2 using System.Collections.Generic; 3 using System.Com

解析Xml文件的三种方式及其特点

解析Xml文件的三种方式 1.Sax解析(simple api  for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用回调函数来实现. 1 class MyDefaultHander extends DefaultHandler{ 2 private List<Student> list; 3 private Student student; 4 5 @Override 6 public void startDo

SpringMVC加载配置Properties文件的几种方式

最近开发的项目使用了SpringMVC的框架,用下来感觉SpringMVC的代码实现的非常优雅,功能也非常强大, 网上介绍Controller参数绑定.URL映射的文章都很多了,写这篇博客主要总结一下SpringMVC加载配置Properties文件的几种方式 通过读取Config文件的配置例如: Map<String, String> group = ConfigurationManager.GetConfiguration("config1"); this.setBcp

iOS开发 跳转场景的三种方式

假设A跳转到B,三种方法: 1.按住ctrl键,拖动A上的控件(比如说UIButton)到B上,弹出菜单,选择Modal.不需要写任何代码,在A上点击Button就会跳转到B 2. 按住ctrl键,拖动A上的View Controller到B上,弹出菜单,选择Modal,两个场景间自动添加连接线和图标,选中该图标,打开Storyboard Segue,identifier输入一个标识符,这里以”aaaa”为例.A里需要跳转时,执行下面的代码: 1 [self performSegueWithId

java读取XML文件的四种方式

java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT> <VALUE> <NO>A1234</NO> <ADDR>河南省郑州市</ADDR> </VALUE> <VALUE> <NO>B1234</NO> <ADDR>河南省郑州市二七区&