package com.gh.common.util; import android.content.Context; import android.os.Environment; import android.os.StatFs; import android.os.StrictMode; import org.json.JSONObject; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.UUID; /** * * @author guanchao wen * @email shuwoom.wgc@gmail.com * @modify hzh 2016/03/16 * @update 2015-7-29下午2:26:02 */ public class FileUtils { private final static String TEST_FILE_NAME = System.currentTimeMillis() + ".log"; public static String getDownloadDir(Context context) { String dir = null; if (isMounted()) { String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath(); dir = checkDir(baseDir + File.separator + "gh-download"); File file = new File(dir + File.separator + TEST_FILE_NAME); if (!file.exists()) { try { if (!file.createNewFile()) { // cannot create file Utils.log("cannot create file"); dir = null; } } catch (IOException e) { e.printStackTrace(); // cannot create file Utils.log("cannot create file"); dir = null; } } } if (dir == null) { String baseDir = context.getFilesDir().getAbsolutePath(); dir = checkDir(baseDir + File.separator + "gh-download"); try { Runtime.getRuntime().exec("chmod 755 " + dir); } catch (IOException e) { e.printStackTrace(); } } return dir; } public static String getDownloadPath(Context context, String name) { return getDownloadDir(context) + File.separator + name; } public static String getLogPath(Context context, String name) { return checkDir(getDir(context, "log")) + File.separator + name; } public static String getPlatformPicDir(Context context) { return checkDir(getDir(context, "PlatformPic")); } private static String checkDir(String dir) { File directory = new File(dir); if (directory.exists() && !directory.isDirectory()) { directory.delete(); } if (!directory.exists()) { directory.mkdirs(); } return dir; } public static void deleteFile(String savePath) { File file = new File(savePath); if (file.exists()) { file.delete(); } } public static void deleteFolder(File folder) { if (folder != null) { if (folder.isDirectory()) { for (File file : folder.listFiles()) { if (file.isDirectory()) { deleteFolder(file); } else { file.delete(); } } } folder.delete(); } } public static boolean isEmptyFile(String path) { File file = new File(path); return !(file.exists() && file.length() != 0); } public static boolean isMounted() { return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); } public static String getDir(Context context, String dir) { if (isMounted()) { // /storage/emulated/0/Android/data/包名/files File file = context.getExternalFilesDir(null); if (file != null) { return file.getAbsolutePath() + File.separator + dir; } } // /data/data/包名/files return context.getFilesDir().getAbsolutePath() + File.separator + dir; } // 返回剩余空间 单位MB @SuppressWarnings("deprecation") public static float getFreeSpaceByPath(String path) { StatFs statfs = new StatFs(path); long blockSize = statfs.getBlockSize(); long availableBlocks = statfs.getAvailableBlocks(); return availableBlocks * blockSize / 1024f / 1024f; } public static String isCanDownload(Context context, String size) { String msg = null; String packageSizeStr = ""; for (int i = 0; i < size.length(); i++) { if ((size.charAt(i) >= 48 && size.charAt(i) <= 57) || size.charAt(i) == 46) { packageSizeStr += size.charAt(i); } } float packageSize = 0; if (packageSizeStr.length() != 0) { packageSize = Float.valueOf(packageSizeStr); } float freeSpace = getFreeSpaceByPath(getDownloadDir(context)); if (freeSpace < packageSize) { msg = "手机存储空间不足,无法进行下载!"; } return msg; } // 下载文件 public static int downloadFile(String url, String savePath) { DataInputStream dis = null; FileOutputStream fos = null; try { HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5 * 1000); connection.setReadTimeout(5 * 1000); connection.connect(); int code = connection.getResponseCode(); if (code == 200) { dis = new DataInputStream(connection.getInputStream()); File file = new File(savePath); if (file.exists()) { file.delete(); } file.createNewFile(); fos = new FileOutputStream(file); byte[] buffer = new byte[1024]; int len; while ((len = dis.read(buffer)) != -1) { fos.write(buffer, 0, len); } fos.flush(); } return code; } catch (IOException e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } if (dis != null) { try { dis.close(); } catch (IOException e) { e.printStackTrace(); } } } return -1; } // 上传文件 public static JSONObject uploadFile(String url, String filePath, String token) { String end = "\r\n"; String twoHyphens = "--"; String boundary = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 16); try { HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); /* * Output to the connection. Default is false, set to true because * post method must write something to the connection */ connection.setDoOutput(true); // Read from the connection. Default is true. connection.setDoInput(true); // Post cannot use caches connection.setUseCaches(false); // Set the post method. Default is GET connection.setRequestMethod("POST"); connection.setConnectTimeout(5 * 1000); connection.setReadTimeout(5 * 1000); // 设置请求属性 connection.setRequestProperty("Connection", "Keep-Alive"); connection.setRequestProperty("Charset", "UTF-8"); connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); if (token != null) { connection.setRequestProperty("TOKEN", token); } // 设置StrictMode 否则HTTPURLConnection连接失败,因为这是在主进程中进行网络连接 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build()); File file = new File(filePath); if (file.exists()) { Utils.log("name = " + file.getName()); Utils.log("length = " + file.length()); } // 设置DataOutputStream,getOutputStream中默认调用connect() DataOutputStream dos = new DataOutputStream(connection.getOutputStream()); // output // to the connection dos.writeBytes(twoHyphens + boundary + end); dos.writeBytes("Content-Disposition: form-data; " + "name=\"Filedata\";filename=\"" + file.getName() + "\"" + end); dos.writeBytes(end); // 取得文件的FileInputStream FileInputStream fStream = new FileInputStream(file); // 设置每次写入8192bytes int bufferSize = 8192; byte[] buffer = new byte[bufferSize]; // 8k int length; // 从文件读取数据至缓冲区 while ((length = fStream.read(buffer)) != -1) { // 将资料写入DataOutputStream中 dos.write(buffer, 0, length); } dos.writeBytes(end); dos.writeBytes(twoHyphens + boundary + twoHyphens + end); // 关闭流,写入的东西自动生成Http正文 fStream.close(); // 关闭DataOutputStream dos.flush(); dos.close(); InputStream inputStream; try { inputStream = connection.getInputStream(); } catch (IOException ioe) { inputStream = connection.getErrorStream(); } int ch; StringBuffer b = new StringBuffer(); while ((ch = inputStream.read()) != -1) { b.append((char) ch); } // 显示网页响应内容 Utils.log("content = " + b.toString().trim()); int statusCode = connection.getResponseCode(); Utils.log("statusCode = " + statusCode); if (statusCode == 200) { // {"icon":"http:\/\/gh-test-1.oss-cn-qingdao.aliyuncs.com\/pic\/57e4f4d58a3200042d29492f.jpg"} JSONObject response = new JSONObject(b.toString().trim()); response.put("statusCode", 200); return response; } else if (statusCode == 403) { JSONObject response = new JSONObject(b.toString().trim()); response.put("statusCode", 403); return response; } else if (statusCode == 401) { JSONObject response = new JSONObject(); response.put("statusCode", 401); return response; } } catch (Exception e) { // 显示异常信息 e.printStackTrace(); Utils.log("Fail:" + e); } return null; } // 读取文件,返回byte[] public static byte[] readFile(File file) { if (file == null) { return null; } FileInputStream fis = null; ByteArrayOutputStream bos = null; try { fis = new FileInputStream(file); bos = new ByteArrayOutputStream(); byte[] buffer = new byte[2048]; int len; while ((len = fis.read(buffer)) != -1) { bos.write(buffer, 0, len); } bos.flush(); return bos.toByteArray(); } catch (IOException e) { e.printStackTrace(); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } if (bos != null) { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } // 根据byte[],保存文件 public static void saveFile(File file, byte[] data) { if (file == null || data == null) { return; } ByteArrayInputStream bis = null; FileOutputStream fos = null; try { bis = new ByteArrayInputStream(data); fos = new FileOutputStream(file); byte[] buffer = new byte[2048]; int len; while ((len = bis.read(buffer)) != -1) { fos.write(buffer, 0, len); } fos.flush(); } catch (IOException e) { e.printStackTrace(); } finally { if (bis != null) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } }