package com.yixia.camera.util; import android.os.Environment; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.math.BigInteger; import java.net.FileNameMap; import java.net.URLConnection; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class FileUtils { /** 拼接路径 * concatPath("/mnt/sdcard", "/DCIM/Camera") => /mnt/sdcard/DCIM/Camera * concatPath("/mnt/sdcard", "DCIM/Camera") => /mnt/sdcard/DCIM/Camera * concatPath("/mnt/sdcard/", "/DCIM/Camera") => /mnt/sdcard/DCIM/Camera * */ public static String concatPath(String... paths) { StringBuilder result = new StringBuilder(); if (paths != null) { for (String path : paths) { if (path != null && path.length() > 0) { int len = result.length(); boolean suffixSeparator = len > 0 && result.charAt(len - 1) == File.separatorChar;//后缀是否是'/' boolean prefixSeparator = path.charAt(0) == File.separatorChar;//前缀是否是'/' if (suffixSeparator && prefixSeparator) { result.append(path.substring(1)); } else if (!suffixSeparator && !prefixSeparator) {//补前缀 result.append(File.separatorChar); result.append(path); } else { result.append(path); } } } } return result.toString(); } /** 计算文件的md5值 */ public static String calculateMD5(File updateFile) { MessageDigest digest; try { digest = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { Log.e("FileUtils", "Exception while getting digest", e); return null; } InputStream is; try { is = new FileInputStream(updateFile); } catch (FileNotFoundException e) { Log.e("FileUtils", "Exception while getting FileInputStream", e); return null; } //DigestInputStream byte[] buffer = new byte[8192]; int read; try { while ((read = is.read(buffer)) > 0) { digest.update(buffer, 0, read); } byte[] md5sum = digest.digest(); BigInteger bigInt = new BigInteger(1, md5sum); String output = bigInt.toString(16); // Fill to 32 chars output = String.format("%32s", output).replace(' ', '0'); return output; } catch (IOException e) { throw new RuntimeException("Unable to process file for MD5", e); } finally { try { is.close(); } catch (IOException e) { Log.e("FileUtils", "Exception on closing MD5 input stream", e); } } } /** 计算文件的md5值 */ public static String calculateMD5(File updateFile, int offset, int partSize) { MessageDigest digest; try { digest = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { Log.e("FileUtils", "Exception while getting digest", e); return null; } InputStream is; try { is = new FileInputStream(updateFile); } catch (FileNotFoundException e) { Log.e("FileUtils", "Exception while getting FileInputStream", e); return null; } //DigestInputStream final int buffSize = 8192;//单块大小 byte[] buffer = new byte[buffSize]; int read; try { if (offset > 0) { is.skip(offset); } int byteCount = Math.min(buffSize, partSize), byteLen = 0; while ((read = is.read(buffer, 0, byteCount)) > 0 && byteLen < partSize) { digest.update(buffer, 0, read); byteLen += read; //检测最后一块,避免多读数据 if (byteLen + buffSize > partSize) { byteCount = partSize - byteLen; } } byte[] md5sum = digest.digest(); BigInteger bigInt = new BigInteger(1, md5sum); String output = bigInt.toString(16); // Fill to 32 chars output = String.format("%32s", output).replace(' ', '0'); return output; } catch (IOException e) { throw new RuntimeException("Unable to process file for MD5", e); } finally { try { is.close(); } catch (IOException e) { Log.e("FileUtils", "Exception on closing MD5 input stream", e); } } } /** 检测文件是否可用 */ public static boolean checkFile(File f) { if (f != null && f.exists() && f.canRead() && (f.isDirectory() || (f.isFile() && f.length() > 0))) { return true; } return false; } /** 检测文件是否可用 */ public static boolean checkFile(String path) { if (StringUtils.isNotEmpty(path)) { File f = new File(path); if (f != null && f.exists() && f.canRead() && (f.isDirectory() || (f.isFile() && f.length() > 0))) return true; } return false; } /** 获取sdcard路径 */ public static String getExternalStorageDirectory() { String path = Environment.getExternalStorageDirectory().getPath(); if (DeviceUtils.isZte()) { // if (!Environment.getExternalStoragePublicDirectory( // Environment.DIRECTORY_DCIM).exists()) { path = path.replace("/sdcard", "/sdcard-ext"); // } } return path; } public static long getFileSize(String fn) { File f = null; long size = 0; try { f = new File(fn); size = f.length(); } catch (Exception e) { e.printStackTrace(); } finally { f = null; } return size < 0 ? null : size; } public static long getFileSize(File fn) { return fn == null ? 0 : fn.length(); } public static String getFileType(String fn, String defaultType) { FileNameMap fNameMap = URLConnection.getFileNameMap(); String type = fNameMap.getContentTypeFor(fn); return type == null ? defaultType : type; } public static String getFileType(String fn) { return getFileType(fn, "application/octet-stream"); } public static String getFileExtension(String filename) { String extension = ""; if (filename != null) { int dotPos = filename.lastIndexOf("."); if (dotPos >= 0 && dotPos < filename.length() - 1) { extension = filename.substring(dotPos + 1); } } return extension.toLowerCase(); } public static boolean deleteFile(File f) { if (f != null && f.exists() && !f.isDirectory()) { return f.delete(); } return false; } public static void deleteDir(File f) { if (f != null && f.exists() && f.isDirectory()) { for (File file : f.listFiles()) { if (file.isDirectory()) deleteDir(file); file.delete(); } f.delete(); } } public static void deleteDir(String f) { if (f != null && f.length() > 0) { deleteDir(new File(f)); } } public static boolean deleteFile(String f) { if (f != null && f.length() > 0) { return deleteFile(new File(f)); } return false; } /** * read file * * @param filePath * @param charsetName * The name of a supported {@link java.nio.charset.Charset * </code>charset<code>} * @return if file not exist, return null, else return content of file * @throws RuntimeException * if an error occurs while operator BufferedReader */ public static String readFile(File file, String charsetName) { StringBuilder fileContent = new StringBuilder(""); if (file == null || !file.isFile()) { return fileContent.toString(); } BufferedReader reader = null; try { InputStreamReader is = new InputStreamReader(new FileInputStream(file), charsetName); reader = new BufferedReader(is); String line = null; while ((line = reader.readLine()) != null) { if (!fileContent.toString().equals("")) { fileContent.append("\r\n"); } fileContent.append(line); } reader.close(); } catch (IOException e) { throw new RuntimeException("IOException occurred. ", e); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { throw new RuntimeException("IOException occurred. ", e); } } } return fileContent.toString(); } public static String readFile(String filePath, String charsetName) { return readFile(new File(filePath), charsetName); } public static String readFile(File file) { return readFile(file, "utf-8"); } /** * 文件拷贝 * * @param from * @param to * @return */ public static boolean fileCopy(String from, String to) { boolean result = false; int size = 1 * 1024; FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream(from); out = new FileOutputStream(to); byte[] buffer = new byte[size]; int bytesRead = -1; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } out.flush(); result = true; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (in != null) { in.close(); } } catch (IOException e) { } try { if (out != null) { out.close(); } } catch (IOException e) { } } return result; } }