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.pswp.cn/news/375555.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375555.shtml
英文地址,請注明出處:http://en.pswp.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;不能動…