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

摘要:
amr格式的文件头是6字节,在进行文件合并的时候要减去除第一个文件以外的其他文件的文件头。下面介绍合并文件的几种方式,并通过合并amr文件来举例介绍合并文件的具体流程。具体你可以学习Android开发教程。=-1){fos.write;}fos.flush();fis.close();}fos.close();//所有的文件合并结束,关闭输出流Log.i;}catch{//TODOAuto-generatedcatchblocke.printStackTrace();}//删除合并过的临时文件for{if{file.delete();}}}方式二:通过FileChannel方式/***通过FileChannel方式**/publicvoidmergeFiles2(){FilerealFile=getFile;FileChannelmFileChannel;try{FileOutputStreamfos=newFileOutputStream;mFileChannel=fos.getChannel();FileChannelinFileChannel;for{inFileChannel=newFileInputStream.getChannel();//下面应该根据不同文件减去相应的文件头inFileChannel.transferTo;inFileChannel.close();}fos.close();mFileChannel.close();}catch{//TODOAuto-generatedcatchblocke.printStackTrace();}}方式三:通过RandomAccessFile方式/***通过RandomAccessFile方式**/publicvoidmergeFiles3(){try{FilerealFile=getFile;FileOutputStreamfos=newFileOutputStream;RandomAccessFilera=null;for{ra=newRandomAccessFile;if(i!

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

注意:不同文件的文件头是不一样的,所以在合并的时候根据不同文件相应的减去合并文件的文件头。具体你可以学习Android开发教程

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

/**用于存放要合并的文件的集合**/
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();
}
}

还有更多移动互联网教程资讯等请关注e良师益友网。

免责声明:文章转载自《Android合并文件的三种方式代码》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇pyQt5简单使用Shell脚本学习笔记3——控制GPIO下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android 异常捕获

  在用户使用APP时,如果APP毫无征兆的突然退出程序,又没有任何提示信息。我想这是一种最差劲的用户体验了吧,如果是我估计干脆就直接卸载APP了。因此,作为Android开发者对于这种情况的发生一定要有处理才行。否则,对于大多数最求完美的程序员而言自己也不能原谅自己。其实捕获全局异常,还可以做一个登出处理,比如用户在登陆APP后,服务端会通过seesio...

解决Android与服务器交互大容量数据问题

对于目前的状况来说,移动终端的网络状况没有PC网络状况那么理想。在一个Android应用中,如果需要接收来自服务器的大容量数据,那么就不得不考虑客户的流量问题。本文根据笔者的一个项目实战经验出发,解决大容量数据的交互问题,解决数据大小会根据实际情况动态切换问题(服务器动态选择是否要压缩数据,客户端动态解析数据是否是被压缩的),还有数据交互的编码问题。 解决...

android widget 开发实例 : 桌面便签程序的实现具体解释和源代码 (上)

如有错漏请不吝拍砖指正,转载请注明出处,很感谢   桌面便签软件是android上经常使用软件的一种,比方比較早的Sticky Note,就曾很流行, Sticky Note的介绍能够參见 http://www.tompda.com/c/article/11778/  而实际上使用android平台对widget开发的支持,桌面便签类软件是很易于开发...

Java反射及其在Android中的应用学习总结

一. Java反射机制 Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制同意程序在执行时透过Reflection APIs取得不论什么一个已知名称的class的内部信息,包含其modifiers(诸如public, static 等等)、superclass(比如Object)、实现之interfaces(比如Seria...

Android笔记之强大的buildConfigField

在进行项目开发或维护时,经常会遇到调试和发布所用到的参数值不一致的情况 例如,服务器会分测试和正式,为了能方便地更改(自动更换)服务器地址,buildConfigField就派上用场了 以前都是手动更改的,极易出错T_T buildConfigField语法如下 buildConfigField "TypeName", "FieldName", "Fiel...

Kotlin 实战记录(一):Android Studio + Kotlin 开发问题整理

近期转向kotlin进行项目开发,途中遇到了不少IDE+配置的问题,这里会进行一一的汇总和整理问题及解决方案。 一、New Gradle Sync is not supported due to containing Kotlin modules using an unsupported plugin version 问题分析: 导致此问题的情况可能是以下...