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开发之合并文件的几种方式的更多相关文章
- android 随手记 读写文件的几种方式
java中多种方式读文件 一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内容 4.随机读取文件内容 */ import java.io.BufferedRe ...
- android中解析文件的三种方式
android中解析文件的三种方式 好久没有动手写点东西了,最近在研究android的相关技术,现在就android中解析文件的三种方式做以下总结.其主要有:SAX(Simple API fo ...
- 在Android开发中,定时执行任务的3种实现方法
在Android开发中,定时执行任务的3种实现方法: 一.采用Handler与线程的sleep(long)方法(不建议使用,Java的实现方式)二.采用Handler的postDelayed(Runn ...
- OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰)
OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰) 前文曾详细探讨了关于OpenCV的使用,原本以为天下已太平.但不断有人反 ...
- C#中的Excel操作【1】——设置Excel单元格的内容,打开Excel文件的一种方式
前言 作为项目管理大队中的一员,在公司里面接触最多的就是Excel文件了,所以一开始就想从Excel入手,学习简单的二次开发,开始自己的编程之路! 程序界面 功能说明 打开文件按钮,可以由使用者指定要 ...
- 【转】Android开发学习笔记:5大布局方式详解
Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件. 帧布局(FrameLayout):组件从屏幕左上方布局组件. 表格布局(Tabl ...
- SpringMVC加载配置Properties文件的几种方式
最近开发的项目使用了SpringMVC的框架,用下来感觉SpringMVC的代码实现的非常优雅,功能也非常强大, 网上介绍Controller参数绑定.URL映射的文章都很多了,写这篇博客主要总结一下 ...
- 解析Xml文件的三种方式及其特点
解析Xml文件的三种方式 1.Sax解析(simple api for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用 ...
- Android跟蓝牙耳机建立连接有两种方式
Android 跟蓝牙耳机建立连接有两种方式. 1. Android 主动跟蓝牙耳机连BluetoothSettings 中和蓝牙耳机配对上之后, BluetoothHeadsetService 会收 ...
随机推荐
- Microsoft Visio 2010 怎样把直线,虚线与箭头之间切换
我也是第一次接触这个东西,感慨是把箭头变成直线都搞了半天没搞出来,上网搜页没结果,一次偶然我会了,真是老天爷眷顾我,如今把方法给大家分享,欢迎大家不吝赐教. 直线变箭头: 刚開始是直线: 接着选中直线 ...
- java中的特殊字符集合
JAVA中转义字符: 1.八进制转义序列:\ + 1到3位5数字:范围'\000'~'\377' \0:空字符 2.Unicode转义字符:\u + 四个 十六进制数字:0~65535 ...
- linux su,sudo命令
linux su 命令 建议大家切换用户的时候 使用 su - root 这样,否则可能发现某些命令执行不了 关于su .su - 及 sudo的区别 请往下看 1.命令作用 su的作用是变更为其它使 ...
- Redshift扩容及踩到的坑
下午发现redshift集群已经没有什么空间了.删掉一些不须要的暂时表也仅仅降到86%左右,为了能放下这两天的数据必须扩容了 watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...
- devstack安装使用openstack常见问题与解决的方法
声明: 本博客欢迎转发,但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 内容系本人学习.研究和总结.如有雷同,实属荣幸! 安装执行create-sta ...
- Microsoft Build 2016 Day 2
Microsoft Build 2016 Day 2 Microsoft Build 2016 Day 1 记录 Microsoft Build 2016 进行到了第二天,我觉得这一天的内容非常精彩, ...
- Windows Phone开发(31):画刷
原文:Windows Phone开发(31):画刷 画刷是啥玩意儿?哈,其实画刷是用来涂鸦,真的,没骗你,至于你信不信,反正我信了. 本文通过价绍几个典型的画刷,使你明白画刷就是用来涂鸦的. 一.纯色 ...
- Android (1) - Activity
onCreate(Bundle status) --> setContentView(View view) --> findViewById(int id) Intent intentFo ...
- Codeforces Round#309 C Kyoya and Colored Balls
给定一个k表示颜色的种类从1到k 然后接下来k行, 每行一个数字, 代表该颜色的球有多少个 这些球都放在一个包中,然后依次拿出. 要求颜色i的最后一个球, 必须要排在颜色i+1的最后一个球前面, ...
- Java RMI(远程方法调用) 实例与分析 (转)
目的: 通过本文,可以加深对Java RMI的理解,知道它的工作原理,怎么使用等. 也为了加深我自己的理解,故整理成文.不足之处,还望指出. 概念解释: RMI(RemoteMethodInvocat ...