Android笔记之 文件保存、压缩与清空删除

这两天改进优化项目中图片上传的代码,考虑到可能有7、8M的比较大的图片,因为要先进行压缩。所以设计到文件的压缩,保存与清空删除操作。在这里记下笔记。

/**
	 * 压缩并另存为,每次先清空再保存
	 */
	private void compressFile(){
		//清空保存目录下的旧照片
		String saveDir = Environment.getExternalStorageDirectory()
				+ "/bag/uploadPictures";
		File imageDir = new File(saveDir);
		if (imageDir.exists()) {
			clearFolder(imageDir);
		}else{
			imageDir.mkdirs();
		}
		//判断图片大小,大于300k则压缩
		for (int i = 0; i < imagePathList.size(); i++) {
			Bitmap bitmap = compressImage(imagePathList.get(i));
			imagePathList.set(i, saveImage(saveDir,bitmap));
		}
	}

	/**保存图片,输入保存目录和bitmap,以日期命名,返回保存路径
	 *
	 * @param path
	 * @param bitmap
	 * @return
	 */
	private String saveImage(String path ,Bitmap bitmap){
		  Date dt = new Date();
		  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		  String imageName =sdf.format(dt)+".jpg";   

		File file = new File(path,imageName );
		  if (file.exists()) {
			  file.delete();
		  }
		  try {
		   FileOutputStream out = new FileOutputStream(file);
		   bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
		   out.flush();
		   out.close();
		   Log.d(TAG, "图片已经保存");
		   return path+"/"+imageName;
		  } catch (FileNotFoundException e) {
			  Log.d(TAG, "文件不存在");
		     e.printStackTrace();
		     return "";
		  } catch (IOException e) {
			  Log.d(TAG, "IO异常"+e.toString());
		   e.printStackTrace();
		   return "";
		  }
	}

	/**
	 * 压缩图片
	 * @param imagePath
	 * @return
	 */
	private Bitmap compressImage(String imagePath) {
		PhotoUpBitmapCache bitmapCache = new PhotoUpBitmapCache();
		//取1280*720大小
		Bitmap image = bitmapCache.revitionImage(imagePath, 1280,720);
		//用下面这个行代码会造成OOM,所以必须用Android 自带的方法去先压缩再导入
//		Bitmap image = BitmapFactory.decodeFile(imagePath);
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
		int options = 100;
		while ( baos.toByteArray().length /1024 > 300) {	//循环判断如果压缩后图片是否大于100kb,大于继续压缩
			baos.reset();//重置baos即清空baos
			image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
			options -= 5;//每次都减少5%
		}
		ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
		Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
		 Log.d(TAG, "文件压缩成功");
		return bitmap;
	}

	/**
	 * 清空文件夹里面所有子文件
	 */
    private void clearFolder(File file) {   

        if(file.isDirectory()){
            File[] childFiles = file.listFiles();
            if (childFiles == null || childFiles.length == 0) {  

                return;
            }  

            for (int i = 0; i < childFiles.length; i++) {
                childFiles[i].delete();
            }  

            return ;
        }
    } 
时间: 2024-10-25 16:02:30

Android笔记之 文件保存、压缩与清空删除的相关文章

Android app的文件保存目录

Android app的文件保存目录可以是app内置私有的目录,当然也可以选择外置sdcard目录 内置私有目录 /data/data/[packagename]/files 文件缓存目录,一般存小的文件缓存,如果是图片,不建议放这里,一般放到外置卡. File file = getFilesDir(); 返回该目录 写文件到该目录下可以像这样 FileOutputStream fos = null; try { fos = appontext.openFileOutput(name, Cont

Android开发之文件保存读取

Android中文件保存读取可选择在手机本身存储.外存储如SD卡中进行,本文将依次介绍. 1.在手机本身存储保存.读取文件. 布局文件如下:     效果图如下: 在文件名框中填写保存时的文件名,文件内容框填写保存内容,点击保存后即可实现保存至手机本身存储. .java代码如下: MainActivity.java 此处的getApplicationContex()方法(生命周期是整个应用,用MainActivity.this代替时表示获取的是该Activity的上下文,生命周期为该Activi

Android数据保存之文件保存

前言: 上一篇文章写了在Android中利用SharedPreferences保存数据,SharedPreferences在保存数据的时候主要是保存一些应用程序的设置信息或者少量的用户信息,而且是以key-value形式保存的String类的信息,比較有局限性. 比方你须要保存从网络获取的图片到本地作为缓存数据,而且数量比較大.SharedPreferences就不能满足你的需求了,这个时候就要用到基本上全部平台都会用到的文件保存. Android中以文件形式把数据保存到磁盘上与其它平台基本上都

Linux学习笔记&lt;十三&gt;——文件压缩、解压缩和归档

压缩.解压缩命令: 1.compress/uncompress:压缩格式为Z,文件后缀为.Z compress /path/to/file uncompress /path/to/file.Z 2.gzip/gunzip/zcat:压缩格式为gz,文件后缀为.gz gzip [OPTION] /path/to/file:,压缩文件保存在被压缩文件的目录,压缩完成后会删除原文件 -v|verbose:显示指令执行过程 -d:解压缩,解压缩完成后删除原压缩文件 -#:1-9,指定压缩比,默认为6,数

Java学习笔记之I/O流(读取压缩文件以及压缩文件)

1.读取压缩文件:ZipInputStream 借助ZipFile类的getInputStream方法得到压缩文件的指定项的内容,然后传递给InputStreamReader类的构造方法,返回给BufferedReader类实例化,从而使得指定项的内容输出到内存中. 2.压缩文件:ZipOutputStream 2.1 注意,zipOut.putNextEntry(entry);// 此方法会清空zip文件原来存在的内容,然后写入文件,并将流定位到条目数据的开始处,直到关闭ZipOutputSt

学习Android之第八个小程序文件保存(Notification、AndroidTestCase)

效果图:       .java文件有MainActivity.java.FileService.java.FileServiceTest.java, .xml文件有activity_main.xml. 本次注重AndroidTestCase类的使用,在开发中非常实用.用于测试某一功能. 使用AndroidTestCase类,有如下的要求: 1.在AndroidManifest.xml文件中,<manifest></manifest>中添加如下: <instrumentati

linux笔记 文件的压缩与解压缩gzip、bzip2、xz、zip&unzip、tar打包、tar打包和压缩并用

压缩文件意义节省网络传输带宽,降低磁盘使用率.但会使用一定的cpu. 1.gzip 不支持压缩目录,gzip后直接跟文件名,在当前目录下压缩时,原文件会消失. #gzip filename 指定压缩目录:#gzip -c 123.txt > /tmp/123.txt.gz 将当前目录下123.txt文件压缩到tmp目录下名字为123.txt.gz 解压缩:#gzip -d file.gz #zcat file.gz  查看.gz文件内容 2.bzip2 不支持压缩目录,bzip2后可直接跟文件名

java压缩 GZIP进行简单压缩,ZIP进行多文件保存

java压缩  GZIP进行简单压缩,ZIP进行多文件保存 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlhbmdydWkxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > package org.rui.io.compress; import java.io.BufferedOutputStream; import java.io

Android 学习笔记之实时保存数据-现场保护onSaveInstanceState()

数据保存:在软件开发中我们希望保存下各个Activity数据,以实现客户数据的时时保存,达到较好的用户体验. 那么我们需要解决如下问题: 1.什么时候保存? 2.保存哪些数据? 我想保存应用产生的数据,而这些用户的数据是在Activity与用户进行交互的时候产生的,就是界面上的数据,或者状态. 3.如何进行保存? 4.保存到哪里? 5.编写合适的例子? 创造思路,去哪寻找答案,首先,我想保存应用产生的数据,而这些用户的数据是在Activity与用户进行交互的时候产生的,所以我们进入Activit