Java tutorial
/* * Copyright (C) 2012 www.amsoft.cn * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.dv.Utils; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Environment; import android.os.StatFs; import com.dv.BitMap.DvFileCache; import org.apache.http.Header; import org.apache.http.HttpResponse; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.util.Arrays; import java.util.Comparator; import java.util.regex.Matcher; import java.util.regex.Pattern; // TODO: Auto-generated Javadoc /** * 2012 amsoft.cn * ??DvFileUtil.java * ???. * * @author * @version v1.0 * @date2013-01-18 ?11:52:13 */ public class DvFileUtil { /** ?. */ private static String downPathRootDir = File.separator + "download" + File.separator; /** ?. */ private static String downPathImageDir = downPathRootDir + "cache_images" + File.separator; /** ?. */ private static String downPathFileDir = downPathRootDir + "cache_files" + File.separator; /** MB ??B. */ private static int MB = 1024 * 1024; /** . */ private static String imageDownFullDir = null; /** . */ private static String fileDownFullDir = null; /** 200M?. */ private static int freeSdSpaceNeededToCache = 200 * MB; static { initImageDownFullDir(); initFileDownFullDir(); } /** * SD?.SD????? * * @param url ?? * @param dirPath the dir path * @return ? */ public static String downFileToSD(String url, String dirPath) { InputStream in = null; FileOutputStream fileOutputStream = null; HttpURLConnection connection = null; String downFilePath = null; File file = null; try { if (!isCanUseSD()) { return null; } //SD??? String fileNameNoMIME = getCacheFileNameFromUrl(url); File parentFile = new File(imageDownFullDir); File[] files = parentFile.listFiles(); for (int i = 0; i < files.length; ++i) { String fileName = files[i].getName(); String name = fileName.substring(0, fileName.lastIndexOf(".")); if (name.equals(fileNameNoMIME)) { // return files[i].getPath(); } } URL mUrl = new URL(url); connection = (HttpURLConnection) mUrl.openConnection(); connection.connect(); //??? String fileName = getCacheFileNameFromUrl(url, connection); file = new File(imageDownFullDir, fileName); downFilePath = file.getPath(); if (!file.exists()) { file.createNewFile(); } else { // return file.getPath(); } in = connection.getInputStream(); fileOutputStream = new FileOutputStream(file); byte[] b = new byte[1024]; int temp = 0; while ((temp = in.read(b)) != -1) { fileOutputStream.write(b, 0, temp); } } catch (Exception e) { e.printStackTrace(); DvLogUtil.e(DvFileUtil.class, ""); //?,0B??? if (file != null) { file.delete(); } file = null; downFilePath = null; } finally { try { if (in != null) { in.close(); } } catch (Exception e) { e.printStackTrace(); } try { if (fileOutputStream != null) { fileOutputStream.close(); } } catch (Exception e) { e.printStackTrace(); } try { if (connection != null) { connection.disconnect(); } } catch (Exception e) { e.printStackTrace(); } } if (file != null) { // DvFileCache.addFileToCache(file.getName(), file); } return downFilePath; } /** * ???SD??SD?. * @param url ? * @param type ???AbConstant * ?? * @param width * @param height * @return Bitmap */ public static Bitmap getBitmapFromSDCache(String url, int type, int width, int height) { Bitmap bitmap = null; try { if (DvStrUtil.isEmpty(url)) { return null; } //SD?? ??SD? if (!isCanUseSD() || freeSdSpaceNeededToCache < freeSpaceOnSD()) { bitmap = getBitmapFormURL(url, type, width, height); return bitmap; } if (type != DvImageUtil.ORIGINALIMG && (width <= 0 || height <= 0)) { throw new IllegalArgumentException("???0"); } //?? String downFilePath = downFileToSD(url, imageDownFullDir); if (downFilePath != null) { //? return getBitmapFromSD(new File(downFilePath), type, width, height); } else { return null; } } catch (Exception e) { e.printStackTrace(); } return bitmap; } /** * ???SD??. * * @param file the file * @param type ???AbConstant * ?? * @param newWidth * @param newHeight * @return Bitmap */ public static Bitmap getBitmapFromSD(File file, int type, int newWidth, int newHeight) { Bitmap bit = null; try { //SD?? if (!isCanUseSD()) { return null; } if (type != DvImageUtil.ORIGINALIMG && (newWidth <= 0 || newHeight <= 0)) { throw new IllegalArgumentException("???0"); } //? if (!file.exists()) { return null; } // if (type == DvImageUtil.CUTIMG) { bit = DvImageUtil.cutImg(file, newWidth, newHeight); } else if (type == DvImageUtil.SCALEIMG) { bit = DvImageUtil.scaleImg(file, newWidth, newHeight); } else { bit = DvImageUtil.originalImg(file); } } catch (Exception e) { e.printStackTrace(); } return bit; } /** * ??byte[]. * @param imgByte byte[] * @param fileName ?????.jpg * @param type ???AbConstant * @param newWidth * @param newHeight * @return Bitmap */ public static Bitmap getBitmapFormByte(byte[] imgByte, String fileName, int type, int newWidth, int newHeight) { FileOutputStream fos = null; DataInputStream dis = null; ByteArrayInputStream bis = null; Bitmap b = null; File file = null; try { if (imgByte != null) { file = new File(imageDownFullDir + fileName); if (!file.exists()) { file.createNewFile(); } fos = new FileOutputStream(file); int readLength = 0; bis = new ByteArrayInputStream(imgByte); dis = new DataInputStream(bis); byte[] buffer = new byte[1024]; while ((readLength = dis.read(buffer)) != -1) { fos.write(buffer, 0, readLength); try { Thread.sleep(500); } catch (Exception e) { } } fos.flush(); b = getBitmapFromSD(file, type, newWidth, newHeight); } } catch (Exception e) { e.printStackTrace(); } finally { if (dis != null) { try { dis.close(); } catch (Exception e) { } } if (bis != null) { try { bis.close(); } catch (Exception e) { } } if (fos != null) { try { fos.close(); } catch (Exception e) { } } } return b; } /** * ???URL?. * @param url ?? * @param type ???AbConstant * @param newWidth * @param newHeight * @return Bitmap */ public static Bitmap getBitmapFormURL(String url, int type, int newWidth, int newHeight) { Bitmap bit = null; try { bit = DvImageUtil.getBitmapFormURL(url, type, newWidth, newHeight); } catch (Exception e) { DvLogUtil.d(DvFileUtil.class, "" + e.getMessage()); } return bit; } /** * ???src?. * * @param src srcimage/arrow.png? * @return Bitmap */ public static Bitmap getBitmapFormSrc(String src) { Bitmap bit = null; try { bit = BitmapFactory.decodeStream(DvFileUtil.class.getResourceAsStream(src)); } catch (Exception e) { DvLogUtil.d(DvFileUtil.class, "?" + e.getMessage()); } return bit; } /** * ???SD??. * * @param file the file * @return Bitmap */ public static Bitmap getBitmapFromSD(File file) { Bitmap bitmap = null; try { //SD?? if (!isCanUseSD()) { return null; } //? if (!file.exists()) { return null; } // bitmap = DvImageUtil.originalImg(file); } catch (Exception e) { e.printStackTrace(); } return bitmap; } /** * ????. * * @param Url * @return int ? */ public static int getContentLengthFormUrl(String Url) { int mContentLength = 0; try { URL url = new URL(Url); HttpURLConnection mHttpURLConnection = (HttpURLConnection) url.openConnection(); mHttpURLConnection.setConnectTimeout(5 * 1000); mHttpURLConnection.setRequestMethod("GET"); mHttpURLConnection.setRequestProperty("Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"); mHttpURLConnection.setRequestProperty("Accept-Language", "zh-CN"); mHttpURLConnection.setRequestProperty("Referer", Url); mHttpURLConnection.setRequestProperty("Charset", "UTF-8"); mHttpURLConnection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"); mHttpURLConnection.setRequestProperty("Connection", "Keep-Alive"); mHttpURLConnection.connect(); if (mHttpURLConnection.getResponseCode() == 200) { // ???? mContentLength = mHttpURLConnection.getContentLength(); } } catch (Exception e) { e.printStackTrace(); DvLogUtil.d(DvFileUtil.class, "?" + e.getMessage()); } return mContentLength; } /** * ????. * @param url ? * @return ?? */ public static String getRealFileNameFromUrl(String url) { String name = null; try { if (DvStrUtil.isEmpty(url)) { return name; } URL mUrl = new URL(url); HttpURLConnection mHttpURLConnection = (HttpURLConnection) mUrl.openConnection(); mHttpURLConnection.setConnectTimeout(5 * 1000); mHttpURLConnection.setRequestMethod("GET"); mHttpURLConnection.setRequestProperty("Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"); mHttpURLConnection.setRequestProperty("Accept-Language", "zh-CN"); mHttpURLConnection.setRequestProperty("Referer", url); mHttpURLConnection.setRequestProperty("Charset", "UTF-8"); mHttpURLConnection.setRequestProperty("User-Agent", ""); mHttpURLConnection.setRequestProperty("Connection", "Keep-Alive"); mHttpURLConnection.connect(); if (mHttpURLConnection.getResponseCode() == 200) { for (int i = 0;; i++) { String mine = mHttpURLConnection.getHeaderField(i); if (mine == null) { break; } if ("content-disposition".equals(mHttpURLConnection.getHeaderFieldKey(i).toLowerCase())) { Matcher m = Pattern.compile(".*filename=(.*)").matcher(mine.toLowerCase()); if (m.find()) return m.group(1).replace("\"", ""); } } } } catch (Exception e) { e.printStackTrace(); DvLogUtil.e(DvFileUtil.class, "???"); } return name; } /** * ???xx.??. * @param connection * @return ?? */ public static String getRealFileName(HttpURLConnection connection) { String name = null; try { if (connection == null) { return name; } if (connection.getResponseCode() == 200) { for (int i = 0;; i++) { String mime = connection.getHeaderField(i); if (mime == null) { break; } // "Content-Disposition","attachment; filename=1.txt" // Content-Length if ("content-disposition".equals(connection.getHeaderFieldKey(i).toLowerCase())) { Matcher m = Pattern.compile(".*filename=(.*)").matcher(mime.toLowerCase()); if (m.find()) { return m.group(1).replace("\"", ""); } } } } } catch (Exception e) { e.printStackTrace(); DvLogUtil.e(DvFileUtil.class, "???"); } return name; } /** * ???xx.??. * * @param response the response * @return ?? */ public static String getRealFileName(HttpResponse response) { String name = null; try { if (response == null) { return name; } //??? Header[] headers = response.getHeaders("content-disposition"); for (int i = 0; i < headers.length; i++) { Matcher m = Pattern.compile(".*filename=(.*)").matcher(headers[i].getValue()); if (m.find()) { name = m.group(1).replace("\"", ""); } } } catch (Exception e) { e.printStackTrace(); DvLogUtil.e(DvFileUtil.class, "???"); } return name; } /** * ??????. * * @param url ? * @return ?? */ public static String getCacheFileNameFromUrl(String url) { if (DvStrUtil.isEmpty(url)) { return null; } String name = null; try { name = DvMd5.MD5(url); } catch (Exception e) { e.printStackTrace(); } return name; } /** * ???.???. * * @param url ? * @param response the response * @return ?? */ public static String getCacheFileNameFromUrl(String url, HttpResponse response) { if (DvStrUtil.isEmpty(url)) { return null; } String name = null; try { //?? String suffix = getMIMEFromUrl(url, response); if (DvStrUtil.isEmpty(suffix)) { suffix = ".ab"; } name = DvMd5.MD5(url) + suffix; } catch (Exception e) { e.printStackTrace(); } return name; } /** * ???.???. * * @param url ? * @param connection the connection * @return ?? */ public static String getCacheFileNameFromUrl(String url, HttpURLConnection connection) { if (DvStrUtil.isEmpty(url)) { return null; } String name = null; try { //?? String suffix = getMIMEFromUrl(url, connection); if (DvStrUtil.isEmpty(suffix)) { suffix = ".ab"; } name = DvMd5.MD5(url) + suffix; } catch (Exception e) { e.printStackTrace(); } return name; } /** * ??. * * @param url ? * @param connection the connection * @return ? */ public static String getMIMEFromUrl(String url, HttpURLConnection connection) { if (DvStrUtil.isEmpty(url)) { return null; } String suffix = null; try { //?? if (url.lastIndexOf(".") != -1) { suffix = url.substring(url.lastIndexOf(".")); if (suffix.indexOf("/") != -1 || suffix.indexOf("?") != -1 || suffix.indexOf("&") != -1) { suffix = null; } } if (DvStrUtil.isEmpty(suffix)) { //??? ? String fileName = getRealFileName(connection); if (fileName != null && fileName.lastIndexOf(".") != -1) { suffix = fileName.substring(fileName.lastIndexOf(".")); } } } catch (Exception e) { e.printStackTrace(); } return suffix; } /** * ??. * * @param url ? * @param response the response * @return ? */ public static String getMIMEFromUrl(String url, HttpResponse response) { if (DvStrUtil.isEmpty(url)) { return null; } String mime = null; try { //?? if (url.lastIndexOf(".") != -1) { mime = url.substring(url.lastIndexOf(".")); if (mime.indexOf("/") != -1 || mime.indexOf("?") != -1 || mime.indexOf("&") != -1) { mime = null; } } if (DvStrUtil.isEmpty(mime)) { //??? ? String fileName = getRealFileName(response); if (fileName != null && fileName.lastIndexOf(".") != -1) { mime = fileName.substring(fileName.lastIndexOf(".")); } } } catch (Exception e) { e.printStackTrace(); } return mime; } /** * ??sd??byte[]. * * @param path sd? * @return byte[] */ public static byte[] getByteArrayFromSD(String path) { byte[] bytes = null; ByteArrayOutputStream out = null; try { File file = new File(path); //SD?? if (!isCanUseSD()) { return null; } //? if (!file.exists()) { return null; } long fileSize = file.length(); if (fileSize > Integer.MAX_VALUE) { return null; } FileInputStream in = new FileInputStream(path); out = new ByteArrayOutputStream(1024); byte[] buffer = new byte[1024]; int size = 0; while ((size = in.read(buffer)) != -1) { out.write(buffer, 0, size); } in.close(); bytes = out.toByteArray(); } catch (Exception e) { e.printStackTrace(); } finally { if (out != null) { try { out.close(); } catch (Exception e) { } } } return bytes; } /** * ??byte. * * @param path the path * @param content the content * @param create the create */ public static void writeByteArrayToSD(String path, byte[] content, boolean create) { FileOutputStream fos = null; try { File file = new File(path); //SD?? if (!isCanUseSD()) { return; } //? if (!file.exists()) { if (create) { File parent = file.getParentFile(); if (!parent.exists()) { parent.mkdirs(); file.createNewFile(); } } else { return; } } fos = new FileOutputStream(path); fos.write(content); } catch (Exception e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (Exception e) { } } } } /** * ??SD??. * * @return true ?,false?? */ public static boolean isCanUseSD() { try { return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); } catch (Exception e) { e.printStackTrace(); } return false; } /** * ????. * @return ?SD?download */ public static String getDownPathImageDir() { return downPathImageDir; } /** * ???SD?download/cache_images. * @param downPathImageDir ? */ public static void setDownPathImageDir(String downPathImageDir) { DvFileUtil.downPathImageDir = downPathImageDir; initImageDownFullDir(); } /** * Gets the down path file dir. * * @return the down path file dir */ public static String getDownPathFileDir() { return downPathFileDir; } /** * ???SD?download/cache_files. * @param downPathFileDir ? */ public static void setDownPathFileDir(String downPathFileDir) { DvFileUtil.downPathFileDir = downPathFileDir; initFileDownFullDir(); } /** * ????. * * @return ? */ private static void initImageDownFullDir() { String pathDir = null; try { if (!isCanUseSD()) { return; } //?? File fileRoot = Environment.getExternalStorageDirectory(); File dirFile = new File(fileRoot.getAbsolutePath() + downPathImageDir); if (!dirFile.exists()) { dirFile.mkdirs(); } pathDir = dirFile.getPath(); imageDownFullDir = pathDir; } catch (Exception e) { } } /** * ????. * * @return ? */ private static void initFileDownFullDir() { String pathDir = null; try { if (!isCanUseSD()) { return; } //?? File fileRoot = Environment.getExternalStorageDirectory(); File dirFile = new File(fileRoot.getAbsolutePath() + downPathFileDir); if (!dirFile.exists()) { dirFile.mkdirs(); } pathDir = dirFile.getPath(); fileDownFullDir = pathDir; } catch (Exception e) { } } /** * ?. * * @return true, if successful */ public static boolean initFileCache() { try { DvFileCache.cacheSize = 0; if (!isCanUseSD()) { return false; } File path = Environment.getExternalStorageDirectory(); File fileDirectory = new File(path.getAbsolutePath() + downPathImageDir); File[] files = fileDirectory.listFiles(); if (files == null) { return true; } for (int i = 0; i < files.length; i++) { DvFileCache.cacheSize += files[i].length(); DvFileCache.addFileToCache(files[i].getName(), files[i]); } } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * * ?AbFileCache.maxCacheSizesdcard?FREE_SD_SPACE_NEEDED_TO_CACHE * 40% * * @return true, if successful */ public static boolean freeCacheFiles() { try { if (!isCanUseSD()) { return false; } File path = Environment.getExternalStorageDirectory(); File fileDirectory = new File(path.getAbsolutePath() + downPathImageDir); File[] files = fileDirectory.listFiles(); if (files == null) { return true; } int removeFactor = (int) ((0.4 * files.length) + 1); Arrays.sort(files, new FileLastModifSort()); for (int i = 0; i < removeFactor; i++) { DvFileCache.cacheSize -= files[i].length(); files[i].delete(); DvFileCache.removeFileFromCache(files[i].getName()); } } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * sdcard. * * @return the int */ public static int freeSpaceOnSD() { StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath()); double sdFreeMB = ((double) stat.getAvailableBlocks() * (double) stat.getBlockSize()) / MB; return (int) sdFreeMB; } /** * ???. */ public static class FileLastModifSort implements Comparator<File> { /* (non-Javadoc) * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ public int compare(File arg0, File arg1) { if (arg0.lastModified() > arg1.lastModified()) { return 1; } else if (arg0.lastModified() == arg1.lastModified()) { return 0; } else { return -1; } } } /** * ??B?. * * @return the free sd space needed to cache */ public static int getFreeSdSpaceNeededToCache() { return freeSdSpaceNeededToCache; } /** * ??B?. * * @param freeSdSpaceNeededToCache the new free sd space needed to cache */ public static void setFreeSdSpaceNeededToCache(int freeSdSpaceNeededToCache) { DvFileUtil.freeSdSpaceNeededToCache = freeSdSpaceNeededToCache; } /** * . * * @return true, if successful */ public static boolean removeAllFileCache() { try { if (!isCanUseSD()) { return false; } File path = Environment.getExternalStorageDirectory(); File fileDirectory = new File(path.getAbsolutePath() + downPathImageDir); File[] files = fileDirectory.listFiles(); if (files == null) { return true; } for (int i = 0; i < files.length; i++) { files[i].delete(); } } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * ???Assets. * * @param context the context * @param name the name * @param encoding the encoding * @return the string */ public static String readAssetsByName(Context context, String name, String encoding) { String text = null; InputStreamReader inputReader = null; BufferedReader bufReader = null; try { inputReader = new InputStreamReader(context.getAssets().open(name)); bufReader = new BufferedReader(inputReader); String line = null; StringBuffer buffer = new StringBuffer(); while ((line = bufReader.readLine()) != null) { buffer.append(line); } text = new String(buffer.toString().getBytes(), encoding); } catch (Exception e) { e.printStackTrace(); } finally { try { if (bufReader != null) { bufReader.close(); } if (inputReader != null) { inputReader.close(); } } catch (Exception e) { e.printStackTrace(); } } return text; } /** * ???Raw. * * @param context the context * @param id the id * @param encoding the encoding * @return the string */ public static String readRawByName(Context context, int id, String encoding) { String text = null; InputStreamReader inputReader = null; BufferedReader bufReader = null; try { inputReader = new InputStreamReader(context.getResources().openRawResource(id)); bufReader = new BufferedReader(inputReader); String line = null; StringBuffer buffer = new StringBuffer(); while ((line = bufReader.readLine()) != null) { buffer.append(line); } text = new String(buffer.toString().getBytes(), encoding); } catch (Exception e) { e.printStackTrace(); } finally { try { if (bufReader != null) { bufReader.close(); } if (inputReader != null) { inputReader.close(); } } catch (Exception e) { e.printStackTrace(); } } return text; } /** * Gets the image down full dir. * * @return the image down full dir */ public static String getImageDownFullDir() { return imageDownFullDir; } /** * Sets the image down full dir. * * @param imageDownFullDir the new image down full dir */ public static void setImageDownFullDir(String imageDownFullDir) { DvFileUtil.imageDownFullDir = imageDownFullDir; } /** * Gets the file down full dir. * * @return the file down full dir */ public static String getFileDownFullDir() { return fileDownFullDir; } /** * Sets the file down full dir. * * @param fileDownFullDir the new file down full dir */ public static void setFileDownFullDir(String fileDownFullDir) { DvFileUtil.fileDownFullDir = fileDownFullDir; } }