Android开发中的文件操作工具类FileUtil完整实例

本文实例讲述了Android开发中的文件操作工具类FileUtil。分享给大家供大家参考,具体如下:

package com.ymerp.android.tools;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.LineNumberReader;
import java.io.OutputStream;
import java.io.Reader;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
/**
 * 文件操作工具
 *
 * @author chen.lin
 *
 */
public class FileUtil {
  private static final String TAG = "FileUtil";
  /**
   * 从sd卡取文件
   *
   * @param filename
   * @return
   */
  public String getFileFromSdcard(String filename) {
    ByteArrayOutputStream outputStream = null;
    FileInputStream fis = null;
    try {
      outputStream = new ByteArrayOutputStream();
      File file = new File(Environment.getExternalStorageDirectory(), filename);
      if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
        fis = new FileInputStream(file);
        int len = 0;
        byte[] data = new byte[1024];
        while ((len = fis.read(data)) != -1) {
          outputStream.write(data, 0, len);
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        outputStream.close();
        fis.close();
      } catch (IOException e) {
      }
    }
    return new String(outputStream.toByteArray());
  }
  /**
   * 保存文件到sd
   *
   * @param filename
   * @param content
   * @return
   */
  public static boolean saveContentToSdcard(String filename, String content) {
    boolean flag = false;
    FileOutputStream fos = null;
    try {
      File file = new File(Environment.getExternalStorageDirectory(), filename);
      if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
        fos = new FileOutputStream(file);
        fos.write(content.getBytes());
        flag = true;
      }
    } catch (Exception e) {
      e.printStackTrace();
      flag = false;
    } finally {
      try {
        fos.close();
      } catch (IOException e) {
      }
    }
    return flag;
  }
  /**
   * 取得文件大小
   *
   * @param f
   * @return
   * @throws Exception
   */
  @SuppressWarnings("resource")
  public static long getFileSizes(File f) throws Exception {
    long size = 0;
    if (f.exists()) {
      FileInputStream fis = null;
      fis = new FileInputStream(f);
      size = fis.available();
    } else {
      f.createNewFile();
    }
    return size;
  }
  /**
   * 递归取得文件夹大小
   *
   * @param dir
   * @return
   * @throws Exception
   */
  public static long getFileSize(File dir) throws Exception {
    long size = 0;
    File flist[] = dir.listFiles();
    for (int i = 0; i < flist.length; i++) {
      if (flist[i].isDirectory()) {
        size = size + getFileSize(flist[i]);
      } else {
        size = size + flist[i].length();
      }
    }
    return size;
  }
  /**
   * 转换文件大小
   *
   * @param fileS
   * @return
   */
  public static String FormetFileSize(long fileS) {
    DecimalFormat df = new DecimalFormat("#.00");
    String fileSizeString = "";
    if (fileS < 1024) {
      fileSizeString = df.format((double) fileS) + "B";
    } else if (fileS < 1048576) {
      fileSizeString = df.format((double) fileS / 1024) + "K";
    } else if (fileS < 1073741824) {
      fileSizeString = df.format((double) fileS / 1048576) + "M";
    } else {
      fileSizeString = df.format((double) fileS / 1073741824) + "G";
    }
    return fileSizeString;
  }
  /**
   * 递归求取目录文件个数
   *
   * @param f
   * @return
   */
  public static long getlist(File f) {
    long size = 0;
    File flist[] = f.listFiles();
    size = flist.length;
    for (int i = 0; i < flist.length; i++) {
      if (flist[i].isDirectory()) {
        size = size + getlist(flist[i]);
        size--;
      }
    }
    return size;
  }
  /**
   * 在根目录下搜索文件
   *
   * @param keyword
   * @return
   */
  public static String searchFile(String keyword) {
    String result = "";
    File[] files = new File("/").listFiles();
    for (File file : files) {
      if (file.getName().indexOf(keyword) >= 0) {
        result += file.getPath() + "\n";
      }
    }
    if (result.equals("")) {
      result = "找不到文件!!";
    }
    return result;
  }
  /**
   * @detail 搜索sdcard文件
   * @param 需要进行文件搜索的目录
   * @param 过滤搜索文件类型
   * */
  public static List<String> search(File file, String[] ext) {
    List<String> list = new ArrayList<String>();
    if (file != null) {
      if (file.isDirectory()) {
        File[] listFile = file.listFiles();
        if (listFile != null) {
          for (int i = 0; i < listFile.length; i++) {
            search(listFile[i], ext);
          }
        }
      } else {
        String filename = file.getAbsolutePath();
        for (int i = 0; i < ext.length; i++) {
          if (filename.endsWith(ext[i])) {
            list.add(filename);
            break;
          }
        }
      }
    }
    return list;
  }
  /**
   * 查询文件
   *
   * @param file
   * @param keyword
   * @return
   */
  public static List<File> FindFile(File file, String keyword) {
    List<File> list = new ArrayList<File>();
    if (file.isDirectory()) {
      File[] files = file.listFiles();
      if (files != null) {
        for (File tempf : files) {
          if (tempf.isDirectory()) {
            if (tempf.getName().toLowerCase().lastIndexOf(keyword) > -1) {
              list.add(tempf);
            }
            list.addAll(FindFile(tempf, keyword));
          } else {
            if (tempf.getName().toLowerCase().lastIndexOf(keyword) > -1) {
              list.add(tempf);
            }
          }
        }
      }
    }
    return list;
  }
  /**
   * searchFile 查找文件并加入到ArrayList 当中去
   *
   * @param context
   * @param keyword
   * @param filepath
   * @return
   */
  public static List<Map<String, Object>> searchFile(Context context, String keyword, File filepath) {
    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    Map<String, Object> rowItem = null;
    int index = 0;
    // 判断SD卡是否存在
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
      File[] files = filepath.listFiles();
      if (files.length > 0) {
        for (File file : files) {
          if (file.isDirectory()) {
            if (file.getName().toLowerCase().lastIndexOf(keyword) > -1) {
              rowItem = new HashMap<String, Object>();
              rowItem.put("number", index); // 加入序列号
              rowItem.put("fileName", file.getName());// 加入名称
              rowItem.put("path", file.getPath()); // 加入路径
              rowItem.put("size", file.length() + ""); // 加入文件大小
              list.add(rowItem);
            }
            // 如果目录可读就执行(一定要加,不然会挂掉)
            if (file.canRead()) {
              list.addAll(searchFile(context, keyword, file)); // 如果是目录,递归查找
            }
          } else {
            // 判断是文件,则进行文件名判断
            try {
              if (file.getName().indexOf(keyword) > -1 || file.getName().indexOf(keyword.toUpperCase()) > -1) {
                rowItem = new HashMap<String, Object>();
                rowItem.put("number", index); // 加入序列号
                rowItem.put("fileName", file.getName());// 加入名称
                rowItem.put("path", file.getPath()); // 加入路径
                rowItem.put("size", file.length() + ""); // 加入文件大小
                list.add(rowItem);
                index++;
              }
            } catch (Exception e) {
              Toast.makeText(context, "查找发生错误!", Toast.LENGTH_SHORT).show();
            }
          }
        }
      }
    }
    return list;
  }
  /**
   * 根据后缀得到文件类型
   *
   * @param fileName
   * @param pointIndex
   * @return
   */
  public static String getFileType(String fileName, int pointIndex) {
    String type = fileName.substring(pointIndex + 1).toLowerCase();
    if ("m4a".equalsIgnoreCase(type) || "xmf".equalsIgnoreCase(type) || "ogg".equalsIgnoreCase(type) || "wav".equalsIgnoreCase(type)
        || "m4a".equalsIgnoreCase(type) || "aiff".equalsIgnoreCase(type) || "midi".equalsIgnoreCase(type)
        || "vqf".equalsIgnoreCase(type) || "aac".equalsIgnoreCase(type) || "flac".equalsIgnoreCase(type)
        || "tak".equalsIgnoreCase(type) || "wv".equalsIgnoreCase(type)) {
      type = "ic_file_audio";
    } else if ("mp3".equalsIgnoreCase(type) || "mid".equalsIgnoreCase(type)) {
      type = "ic_file_mp3";
    } else if ("avi".equalsIgnoreCase(type) || "mp4".equalsIgnoreCase(type) || "dvd".equalsIgnoreCase(type)
        || "mid".equalsIgnoreCase(type) || "mov".equalsIgnoreCase(type) || "mkv".equalsIgnoreCase(type)
        || "mp2v".equalsIgnoreCase(type) || "mpe".equalsIgnoreCase(type) || "mpeg".equalsIgnoreCase(type)
        || "mpg".equalsIgnoreCase(type) || "asx".equalsIgnoreCase(type) || "asf".equalsIgnoreCase(type)
        || "flv".equalsIgnoreCase(type) || "navi".equalsIgnoreCase(type) || "divx".equalsIgnoreCase(type)
        || "rm".equalsIgnoreCase(type) || "rmvb".equalsIgnoreCase(type) || "dat".equalsIgnoreCase(type)
        || "mpa".equalsIgnoreCase(type) || "vob".equalsIgnoreCase(type) || "3gp".equalsIgnoreCase(type)
        || "swf".equalsIgnoreCase(type) || "wmv".equalsIgnoreCase(type)) {
      type = "ic_file_video";
    } else if ("bmp".equalsIgnoreCase(type) || "pcx".equalsIgnoreCase(type) || "tiff".equalsIgnoreCase(type)
        || "gif".equalsIgnoreCase(type) || "jpeg".equalsIgnoreCase(type) || "tga".equalsIgnoreCase(type)
        || "exif".equalsIgnoreCase(type) || "fpx".equalsIgnoreCase(type) || "psd".equalsIgnoreCase(type)
        || "cdr".equalsIgnoreCase(type) || "raw".equalsIgnoreCase(type) || "eps".equalsIgnoreCase(type)
        || "gif".equalsIgnoreCase(type) || "jpg".equalsIgnoreCase(type) || "jpeg".equalsIgnoreCase(type)
        || "png".equalsIgnoreCase(type) || "hdri".equalsIgnoreCase(type) || "ai".equalsIgnoreCase(type)) {
      type = "ic_file_image";
    } else if ("ppt".equalsIgnoreCase(type) || "doc".equalsIgnoreCase(type) || "xls".equalsIgnoreCase(type)
        || "pps".equalsIgnoreCase(type) || "xlsx".equalsIgnoreCase(type) || "xlsm".equalsIgnoreCase(type)
        || "pptx".equalsIgnoreCase(type) || "pptm".equalsIgnoreCase(type) || "ppsx".equalsIgnoreCase(type)
        || "maw".equalsIgnoreCase(type) || "mdb".equalsIgnoreCase(type) || "pot".equalsIgnoreCase(type)
        || "msg".equalsIgnoreCase(type) || "oft".equalsIgnoreCase(type) || "xlw".equalsIgnoreCase(type)
        || "wps".equalsIgnoreCase(type) || "rtf".equalsIgnoreCase(type) || "ppsm".equalsIgnoreCase(type)
        || "potx".equalsIgnoreCase(type) || "potm".equalsIgnoreCase(type) || "ppam".equalsIgnoreCase(type)) {
      type = "ic_file_office";
    } else if ("txt".equalsIgnoreCase(type) || "text".equalsIgnoreCase(type) || "chm".equalsIgnoreCase(type)
        || "hlp".equalsIgnoreCase(type) || "pdf".equalsIgnoreCase(type) || "doc".equalsIgnoreCase(type)
        || "docx".equalsIgnoreCase(type) || "docm".equalsIgnoreCase(type) || "dotx".equalsIgnoreCase(type)) {
      type = "ic_file_text";
    } else if ("ini".equalsIgnoreCase(type) || "sys".equalsIgnoreCase(type) || "dll".equalsIgnoreCase(type)
        || "adt".equalsIgnoreCase(type)) {
      type = "ic_file_system";
    } else if ("rar".equalsIgnoreCase(type) || "zip".equalsIgnoreCase(type) || "arj".equalsIgnoreCase(type)
        || "gz".equalsIgnoreCase(type) || "z".equalsIgnoreCase(type) || "7Z".equalsIgnoreCase(type) || "GZ".equalsIgnoreCase(type)
        || "BZ".equalsIgnoreCase(type) || "ZPAQ".equalsIgnoreCase(type)) {
      type = "ic_file_rar";
    } else if ("html".equalsIgnoreCase(type) || "htm".equalsIgnoreCase(type) || "java".equalsIgnoreCase(type)
        || "php".equalsIgnoreCase(type) || "asp".equalsIgnoreCase(type) || "aspx".equalsIgnoreCase(type)
        || "jsp".equalsIgnoreCase(type) || "shtml".equalsIgnoreCase(type) || "xml".equalsIgnoreCase(type)) {
      type = "ic_file_web";
    } else if ("exe".equalsIgnoreCase(type) || "com".equalsIgnoreCase(type) || "bat".equalsIgnoreCase(type)
        || "iso".equalsIgnoreCase(type) || "msi".equalsIgnoreCase(type)) {
      type = "ic_file_exe";
    } else if ("apk".equalsIgnoreCase(type)) {
      type = "ic_file_apk";
    } else {
      type = "ic_file_normal";
    }
    return type;
  }
  /**
   * 改变文件大小显示的内容
   *
   * @param size
   * @return
   */
  public static String changeFileSize(String size) {
    if (Integer.parseInt(size) > 1024) {
      size = Integer.parseInt(size) / 1024 + "K";
    } else if (Integer.parseInt(size) > (1024 * 1024)) {
      size = Integer.parseInt(size) / (1024 * 1024) + "M";
    } else if (Integer.parseInt(size) > (1024 * 1024 * 1024)) {
      size = Integer.parseInt(size) / (1024 * 1024 * 1024) + "G";
    } else {
      size += "B";
    }
    return size;
  }
  /**
   * 得到所有文件
   *
   * @param dir
   * @return
   */
  public static ArrayList<File> getAllFiles(File dir) {
    ArrayList<File> allFiles = new ArrayList<File>();
    // 递归取得目录下的所有文件及文件夹
    File[] files = dir.listFiles();
    for (int i = 0; i < files.length; i++) {
      File file = files[i];
      allFiles.add(file);
      if (file.isDirectory()) {
        getAllFiles(file);
      }
    }
    Logger.i("test", allFiles.size() + "");
    return allFiles;
  }
  /**
   * 判断文件MimeType 类型
   *
   * @param f
   * @return
   */
  public static String getMIMEType(File f) {
    String type = "";
    String fName = f.getName();
    /* 取得扩展名 */
    String end = fName.substring(fName.lastIndexOf(".") + 1, fName.length()).toLowerCase();
    /* 依扩展名的类型决定MimeType */
    if (end.equalsIgnoreCase("m4a") || end.equalsIgnoreCase("mp3") || end.equalsIgnoreCase("mid") || end.equalsIgnoreCase("xmf")
        || end.equalsIgnoreCase("ogg") || end.equalsIgnoreCase("wav")) {
      type = "audio";
    } else if (end.equalsIgnoreCase("3gp") || end.equalsIgnoreCase("mp4")) {
      type = "video";
    } else if (end.equalsIgnoreCase("jpg") || end.equalsIgnoreCase("gif") || end.equalsIgnoreCase("png")
        || end.equalsIgnoreCase("jpeg") || end.equalsIgnoreCase("bmp")) {
      type = "image";
    } else if (end.equalsIgnoreCase("apk")) {
      /* android.permission.INSTALL_PACKAGES */
      type = "application/vnd.android.package-archive";
    } else if (end.equalsIgnoreCase("txt") || end.equalsIgnoreCase("java")) {
      /* android.permission.INSTALL_PACKAGES */
      type = "text";
    } else {
      type = "*";
    }
    /* 如果无法直接打开,就跳出软件列表给用户选择 */
    if (end.equalsIgnoreCase("apk")) {
    } else {
      type += "/*";
    }
    return type;
  }
  /**
   * 拷贝文件
   *
   * @param fromFile
   * @param toFile
   * @throws IOException
   */
  public static void copyFile(File fromFile, String toFile) throws IOException {
    FileInputStream from = null;
    FileOutputStream to = null;
    try {
      from = new FileInputStream(fromFile);
      to = new FileOutputStream(toFile);
      byte[] buffer = new byte[1024];
      int bytesRead;
      while ((bytesRead = from.read(buffer)) != -1)
        to.write(buffer, 0, bytesRead); // write
    } finally {
      if (from != null)
        try {
          from.close();
        } catch (IOException e) {
          Log.e(TAG, "", e);
        }
      if (to != null)
        try {
          to.close();
        } catch (IOException e) {
          Log.e(TAG, "", e);
        }
    }
  }
  /**
   * 创建文件
   *
   * @param file
   * @return
   */
  public static File createNewFile(File file) {
    try {
      if (file.exists()) {
        return file;
      }
      File dir = file.getParentFile();
      if (!dir.exists()) {
        dir.mkdirs();
      }
      if (!file.exists()) {
        file.createNewFile();
      }
    } catch (IOException e) {
      Log.e(TAG, "", e);
      return null;
    }
    return file;
  }
  /**
   * 创建文件
   *
   * @param path
   */
  public static File createNewFile(String path) {
    File file = new File(path);
    return createNewFile(file);
  }// end method createText()
  /**
   * 删除文件
   *
   * @param path
   */
  public static void deleteFile(String path) {
    File file = new File(path);
    deleteFile(file);
  }
  /**
   * 删除文件
   *
   * @param file
   */
  public static void deleteFile(File file) {
    if (!file.exists()) {
      return;
    }
    if (file.isFile()) {
      file.delete();
    } else if (file.isDirectory()) {
      File files[] = file.listFiles();
      for (int i = 0; i < files.length; i++) {
        deleteFile(files[i]);
      }
    }
    file.delete();
  }
  /**
   * 向Text文件中写入内容
   *
   * @param file
   * @param content
   * @return
   */
  public static boolean write(String path, String content) {
    return write(path, content, false);
  }
  public static boolean write(String path, String content, boolean append) {
    return write(new File(path), content, append);
  }
  public static boolean write(File file, String content) {
    return write(file, content, false);
  }
  /**
   * 写入文件
   *
   * @param file
   * @param content
   * @param append
   * @return
   */
  public static boolean write(File file, String content, boolean append) {
    if (file == null || StringUtil.empty(content)) {
      return false;
    }
    if (!file.exists()) {
      file = createNewFile(file);
    }
    FileOutputStream fos = null;
    try {
      fos = new FileOutputStream(file, append);
      fos.write(content.getBytes());
    } catch (Exception e) {
      Log.e(TAG, "", e);
      return false;
    } finally {
      try {
        fos.close();
      } catch (IOException e) {
        Log.e(TAG, "", e);
      }
      fos = null;
    }
    return true;
  }
  /**
   * 获得文件名
   *
   * @param path
   * @return
   */
  public static String getFileName(String path) {
    if (StringUtil.empty(path)) {
      return null;
    }
    File f = new File(path);
    String name = f.getName();
    f = null;
    return name;
  }
  /**
   * 读取文件内容,从第startLine行开始,读取lineCount行
   *
   * @param file
   * @param startLine
   * @param lineCount
   * @return 读到文字的list,如果list.size<lineCount则说明读到文件末尾了
   */
  public static List<String> readFile(File file, int startLine, int lineCount) {
    if (file == null || startLine < 1 || lineCount < 1) {
      return null;
    }
    if (!file.exists()) {
      return null;
    }
    FileReader fileReader = null;
    List<String> list = null;
    try {
      list = new ArrayList<String>();
      fileReader = new FileReader(file);
      LineNumberReader lineReader = new LineNumberReader(fileReader);
      boolean end = false;
      for (int i = 1; i < startLine; i++) {
        if (lineReader.readLine() == null) {
          end = true;
          break;
        }
      }
      if (end == false) {
        for (int i = startLine; i < startLine + lineCount; i++) {
          String line = lineReader.readLine();
          if (line == null) {
            break;
          }
          list.add(line);
        }
      }
    } catch (Exception e) {
      Log.e(TAG, "read log error!", e);
    } finally {
      if (fileReader != null) {
        try {
          fileReader.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
    return list;
  }
  /**
   * 创建文件夹
   *
   * @param dir
   * @return
   */
  public static boolean createDir(File dir) {
    try {
      if (!dir.exists()) {
        dir.mkdirs();
      }
      return true;
    } catch (Exception e) {
      Log.e(TAG, "create dir error", e);
      return false;
    }
  }
  /**
   * 在SD卡上创建目录
   *
   * @param dirName
   */
  public static File creatSDDir(String dirName) {
    File dir = new File(dirName);
    dir.mkdir();
    return dir;
  }
  /**
   * 判断SD卡上的文件是否存在
   */
  public static boolean isFileExist(String fileName) {
    File file = new File(fileName);
    return file.exists();
  }
  /**
   * 将一个InputStream里面的数据写入到SD卡中
   */
  public static File write2SDFromInput(String path, String fileName, InputStream input) {
    File file = null;
    OutputStream output = null;
    try {
      creatSDDir(path);
      file = createNewFile(path + "/" + fileName);
      output = new FileOutputStream(file);
      byte buffer[] = new byte[1024];
      int len = -1;
      while ((len = input.read(buffer)) != -1) {
        output.write(buffer, 0, len);
      }
      output.flush();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        output.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    return file;
  }
  /**
   * 读取文件内容 从文件中一行一行的读取文件
   *
   * @param file
   * @return
   */
  public static String readFile(File file) {
    Reader read = null;
    String content = "";
    String result = "";
    BufferedReader br = null;
    try {
      read = new FileReader(file);
      br = new BufferedReader(read);
      while ((content = br.readLine().toString().trim()) != null) {
        result += content + "\r\n";
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        read.close();
        br.close();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    return result;
  }
  /**
   * 将图片保存到本地时进行压缩, 即将图片从Bitmap形式变为File形式时进行压缩,
   * 特点是: File形式的图片确实被压缩了, 但是当你重新读取压缩后的file为 Bitmap是,它占用的内存并没有改变
   *
   * @param bmp
   * @param file
   */
  public static void compressBmpToFile(Bitmap bmp, File file) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int options = 80;// 个人喜欢从80开始,
    bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);
    while (baos.toByteArray().length / 1024 > 100) {
      baos.reset();
      options -= 10;
      bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);
    }
    try {
      FileOutputStream fos = new FileOutputStream(file);
      fos.write(baos.toByteArray());
      fos.flush();
      fos.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  /**
   * 将图片从本地读到内存时,进行压缩 ,即图片从File形式变为Bitmap形式
   * 特点: 通过设置采样率, 减少图片的像素, 达到对内存中的Bitmap进行压缩
   * @param srcPath
   * @return
   */
  public static Bitmap compressImageFromFile(String srcPath, float pixWidth, float pixHeight) {
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;// 只读边,不读内容
    Bitmap bitmap = BitmapFactory.decodeFile(srcPath, options);
    options.inJustDecodeBounds = false;
    int w = options.outWidth;
    int h = options.outHeight;
    //float pixWidth = 800f;//
    //float pixHeight = 480f;//
    int scale = 1;
    if (w > h && w > pixWidth) {
      scale = (int) (options.outWidth / pixWidth);
    } else if (w < h && h > pixHeight) {
      scale = (int) (options.outHeight / pixHeight);
    }
    if (scale <= 0)
      scale = 1;
    options.inSampleSize = scale;// 设置采样率
    options.inPreferredConfig = Config.ARGB_8888;// 该模式是默认的,可不设
    options.inPurgeable = true;// 同时设置才会有效
    options.inInputShareable = true;// 。当系统内存不够时候图片自动被回收
    bitmap = BitmapFactory.decodeFile(srcPath, options);
    // return compressBmpFromBmp(bitmap);//原来的方法调用了这个方法企图进行二次压缩
    // 其实是无效的,大家尽管尝试
    return bitmap;
  }
  /**
  *  指定分辨率和清晰度的图片压缩
  */
  public void transImage(String fromFile, String toFile, int width, int height, int quality)
  {
    try
    {
      Bitmap bitmap = BitmapFactory.decodeFile(fromFile);
      int bitmapWidth = bitmap.getWidth();
      int bitmapHeight = bitmap.getHeight();
      // 缩放图片的尺寸
      float scaleWidth = (float) width / bitmapWidth;
      float scaleHeight = (float) height / bitmapHeight;
      Matrix matrix = new Matrix();
      matrix.postScale(scaleWidth, scaleHeight);
      // 产生缩放后的Bitmap对象
      Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmapWidth, bitmapHeight, matrix, false);
      // save file
      File myCaptureFile = new File(toFile);
      FileOutputStream out = new FileOutputStream(myCaptureFile);
      if(resizeBitmap.compress(Bitmap.CompressFormat.JPEG, quality, out)){
        out.flush();
        out.close();
      }
      if(!bitmap.isRecycled()){
        bitmap.recycle();//记得释放资源,否则会内存溢出
      }
      if(!resizeBitmap.isRecycled()){
        resizeBitmap.recycle();
      }
    }
    catch (FileNotFoundException e)
    {
      e.printStackTrace();
    }
    catch (IOException ex)
    {
      ex.printStackTrace();
    }
  }
}

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android文件操作技巧汇总》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android布局layout技巧总结》、《Android开发入门与进阶教程》、《Android资源操作技巧汇总》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android 文件读写操作方法总结

    Android 文件读写操作方法总结 在Android中的文件放在不同位置,它们的读取方式也有一些不同. 本文对android中对资源文件的读取.数据区文件的读取.SD卡文件的读取及RandomAccessFile的方式和方法进行了整理.供参考. 一.资源文件的读取: 1) 从resource的raw中读取文件数据: String res = ""; try{ //得到资源中的Raw数据流 InputStream in = getResources().openRawResource(

  • Android操作Excel文件的功能实现

    Android中操作Excel文件导出报表时主要采用开源库jxl,最早用在java上,但也可用于Android.与之类似的POI,因为依赖库众多,所以只能用于java,而不能用于Android. 使用jxl需要在Android工程中导入jxl.jar包,jxl可以完成Excel的基本读写操作,其支持与不支持的情况如下: 1.jxl只支持Excel2003格式,不支持Excel2007格式.即支持xls文件,不支持xlsx文件. 2.jxl不支持直接修改excel文件,但可通过复制新文件覆盖原文件

  • Android操作存放在assets文件夹下SQLite数据库的方法

    本文实例讲述了Android操作存放在assets文件夹下SQLite数据库的方法.分享给大家供大家参考.具体如下: 因为这次的项目需要自带数据,所以就就把数据都放到一个SQLite的数据库文件中了,之后把该文件放到了assets文件夹下面.一开始打算每次都从assets文件夹下面把该文件夹拷贝到手机的SD卡或者手机自身的存储上之后再使用,后来考虑到每次都拷贝的话效率不高,并且如果涉及到对数据库的修改操作的话拷贝之后数据就被恢复了. 因此就写了该封装,该封装只是在第一次使用数据库文件的时候把该文

  • Android编程之文件读写操作与技巧总结【经典收藏】

    本文实例总结了Android文件读写操作.分享给大家供大家参考,具体如下: 在Android中的文件放在不同位置,它们的读取方式也有一些不同. 本文对android中对资源文件的读取.数据区文件的读取.SD卡文件的读取及RandomAccessFile的方式和方法进行了整理.供参考. 一.资源文件的读取: 1) 从resource的raw中读取文件数据: String res = ""; try{ //得到资源中的Raw数据流 InputStream in = getResources

  • Android开发之SD卡文件操作分析

    本文实例讲述了Android开发之SD卡文件操作.分享给大家供大家参考,具体如下: 前面的文章中写过直接操作手机自带存储器的程序,这次就接着上次文章协议下对sd卡的文件操作.与自带存储不同的是使用sd卡需要用户授权 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permissi

  • Android中文件读写(输入流和输出流)操作小结

    1. Android中文件读写的原理: (1).所有文件的储存都是字节的储存. (2).在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘. (3).在读取文件(特别是文本文件)时,也是一个字节一个字节的读取以形成字节序列. 2. 字节流和字符流的区别: (1).字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,字符流就可以. (2).字节流转换成字符流可以用InputStreamReader,OutputStreamWriter. 一般我们在

  • Android 文件操作方法

    数据存储与访问常用方式:文件SharedPreferences(偏好参数设置)SQLite数据库内容提供者(Content provider)网络 Activity(Context)Context.getCacheDir()方法用于获取/data/data/<package name>/cache目录Context.getFilesDir()方法用于获取/data/data/<package name>/files目录 Activity(Context)提供了openFileOut

  • Android开发之多媒体文件获取工具类实例【音频,视频,图片等】

    本文实例讲述了Android开发之多媒体文件获取工具类.分享给大家供大家参考,具体如下: package com.android.ocr.util; import java.io.File; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import

  • Android中扫描多媒体文件操作详解

    这篇文章从系统源代码分析,讲述如何将程序创建的多媒体文件加入系统的媒体库,如何从媒体库删除,以及大多数程序开发者经常遇到的无法添加到媒体库的问题等.本人将通过对源代码的分析,一一解释这些问题. Android中的多媒体文件扫描机制 Android提供了一个很棒的程序来处理将多媒体文件加入的媒体库中.这个程序就是MediaProvider,现在我们简单看以下这个程序.首先看一下它的Receiver 复制代码 代码如下: <receiver android:name="MediaScanner

  • Android开发中的文件操作工具类FileUtil完整实例

    本文实例讲述了Android开发中的文件操作工具类FileUtil.分享给大家供大家参考,具体如下: package com.ymerp.android.tools; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java

  • Android开发之超强图片工具类BitmapUtil完整实例

    本文实例讲述了Android开发之超强图片工具类BitmapUtil.分享给大家供大家参考,具体如下: 说明:为了方便大家使用,本人把大家常用的图片处理代码集中到这个类里 使用了LruCache与SoftReference /** * 图片加载及转化工具 ----------------------------------------------------------------------- 延伸:一个Bitmap到底占用多大内存?系统给每个应用程序分配多大内存? Bitmap占用的内存为:

  • Android开发实现的几何图形工具类GeometryUtil完整实例

    本文实例讲述了Android开发实现的几何图形工具类GeometryUtil.分享给大家供大家参考,具体如下: package com.android.imooc.goo; import android.graphics.PointF; /** * 几何图形工具 */ public class GeometryUtil { /** * As meaning of method name. 获得两点之间的距离 * * @param p0 * @param p1 * @return */ publi

  • Java文件操作工具类fileUtil实例【文件增删改,复制等】

    本文实例讲述了Java文件操作工具类fileUtil.分享给大家供大家参考,具体如下: package com.gcloud.common; import java.io.*; import java.net.MalformedURLException; import java.net.URL; /** * 文件工具类 * Created by charlin on 2017/9/8. */ public class FileUtil { /** * 读取文件内容 * * @param is *

  • JavaSE文件操作工具类FileUtil详解

    本文实例为大家分享了JavaSE文件操作工具类FileUtil的具体代码,供大家参考,具体内容如下 先展示一下文件工具类中打印文件夹树形结构的结果: 代码如下: package com.mjq.iotest; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException;

  • Android开发中DatePicker日期与时间控件实例代码

    一.简介 二.方法 最日常的使用方法了 日期控件DatePicker 时间控件TimePicker 月份从0开始 三.代码实例 效果图: 代码: fry.Activity01 package fry; import com.example.DatePicherDemo1.R; import android.app.Activity; import android.os.Bundle; import android.widget.DatePicker; import android.widget.

  • Android开发中实现用户注册和登陆的代码实例分享

    在android的应用中越来越多的包含了网络互动功能,这就带来了注册,登陆账号功能.本文完整的介绍对话框的方式实现用户登陆功能. 登陆效果: 应用程序判断当前用户还未登陆,弹出登陆对话框,用户输入账号和密码信息后,传到服务器验证,验证成功后,现实Toast 成功信息,并转到其他界面. 注册效果:用户如没有账号,则点击登陆对话框的 "没有账号,快速注册账号", 弹出注册界面,用户输入注册信息,点击注册按钮,注册成功后,弹出toast信息"注册成功",完成注册后,转到其

  • Android开发中解析xml文件XmlUtils工具类与用法示例

    本文实例讲述了Android开发中解析xml文件XmlUtils工具类与用法.分享给大家供大家参考,具体如下: 1. xmlUtil工具类 package com.example.xmlpaserutil.util; import java.io.InputStream; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullP

  • Android文件操作工具类详解

    本文实例为大家分享了Android文件操作工具类的具体代码,供大家参考,具体内容如下 贴上我写的一个文件操作工具类,基本上覆盖了各种文件操作: 1.文件的新建.删除: 2.文件的复制: 3.获取文件扩展名: 4.文件的重命名: 5.获取某个文件的详细信息: 6.计算某个文件的大小: 7.文件大小的格式化: 8.获取某个路径下的文件列表: 9.获取某个目录下的文件列表: 10.目录的新建.删除; 11.目录的复制: 12.计算某个目录包含的文件数量: 13.计算某个目录包含的文件大小: 代码如下:

  • Android开发中日期工具类DateUtil完整实例

    本文实例讲述了Android开发中日期工具类DateUtil.分享给大家供大家参考,具体如下: /** * 日期操作工具类. * @Project ERPForAndroid * @Package com.ymerp.android.tools * @author chenlin * @version 1.0 */ @SuppressLint("SimpleDateFormat") public class DateUtil { private static final String

随机推荐