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();
		  }		
	}


  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在Android项目开发中,处理PDF文件是一项常见的需求。Android提供了一些API和库,可以方便地进行PDF文件的创建、查看和编辑。 首先,我们可以使用Android的Graphics类来创建PDF文件。通过Canvas对象,我们可以在PDF上进行绘制,添加文本、图形、图片等内容。然后使用PdfDocument类将Canvas保存为PDF文件。这样,我们就可以在应用中生成PDF文件,例如生成报告、表格等。 其次,为了实现PDF文件的查看,我们可以使用Android提供的PdfRenderer库。该库允许我们从本地存储或网络上加载PDF文件,并将其渲染到Android应用的界面上。通过该库,我们可以实现类似于阅读器的功能,让用户能够在应用中浏览和翻页查看PDF文件。 另外,如果我们需要在Android应用中编辑PDF文件,可以使用第三方库,如iText或PDFTron。这些库提供了丰富的API,包括添加、删除、修改PDF文件内容,还可以对PDF进行加密、签名等操作。通过使用这些库,我们可以开发出具有PDF编辑功能的Android应用,满足用户对PDF文件的各种需求。 总而言之,Android项目开发中涉及到PDF的处理,我们可以通过Android自带的API和库,或者使用第三方库来实现。无论是创建PDF文件、查看PDF文件,还是编辑PDF文件,都有相应的解决方案可以选择。这些功能的实现将极大地丰富我们开发Android应用的能力。 ### 回答2: Android项目开发中,如果需要生成或者处理PDF文件,有以下几种常见的方法: 首先,可以使用开源库 iText 来生成和处理PDF文件。iText 提供了丰富的API,可以在Android项目中使用。可以通过iText实现创建PDF文档、添加文本、图片、表格、链接等元素,还可以对已有的PDF文件进行编辑、删除、合并等操作,非常灵活方便。 其次,还可以使用Android官方提供的PdfDocument类来生成PDF文件。PdfDocument类是在Android 5.0(API level 21)引入的,用于创建一个PDF文档并添加页面、内容等元素。通过该类,可以很方便地创建、编辑和保存PDF文件。 此外,也可以考虑使用第三方开源库 pdfbox-android 或者 mupdf-android 来进行PDF文件的生成和处理。pdfbox-android 是基于Apache PDFBox库的一个Android版,可以用于在Android项目中进行PDF的创建、编辑、解析等操作;而mupdf-android 则是MuPDF库的Android版本,提供了丰富的PDF处理功能,包括文本处理、渲染、解析等。 总结来说,Android项目开发中如果需要处理PDF文件,可以选择使用iText、PdfDocument、pdfbox-android或者mupdf-android等开源库,根据具体需求选择合适的方法来生成和处理PDF文件。这些方法都可以在Android平台上实现PDF的创建、编辑、解析和渲染等功能,方便开发人员在项目中应用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值