package org.aisen.android.component.bitmaploader.core; import android.text.TextUtils; import org.aisen.android.common.setting.SettingUtility; import org.aisen.android.common.utils.Logger; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.OutputStream; public class FileDisk { private String filePath; private final String IMG_SUFFIX; public FileDisk(String filePath) { if (!TextUtils.isEmpty(SettingUtility.getStringSetting("image_suffix"))) IMG_SUFFIX = SettingUtility.getStringSetting("image_suffix"); else IMG_SUFFIX = "is"; File file = new File(filePath); if (!file.exists()) file.mkdirs(); this.filePath = filePath; } public void writeOutStream(byte[] datas, String url, String key) throws Exception { ByteArrayInputStream in = new ByteArrayInputStream(datas); File file = new File(filePath + File.separator + key + "." + getImageSuffix(url)); if (file.getParentFile().exists()) file.getParentFile().mkdirs(); FileOutputStream out = new FileOutputStream(file); byte[] buffer = new byte[8 * 1024]; int len = -1; while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); } out.flush(); out.close(); in.close(); } public File getFile(String url, String key) { return new File(filePath + File.separator + key + "." + getImageSuffix(url)); } public FileInputStream getInputStream(String url, String key) throws Exception { File file = getFile(url, key); if (file.exists()) { if (file.length() == 0) { file.delete(); Logger.w("文件已损坏,url = " + url); return null; } return new FileInputStream(file); } else Logger.d("getInputStream(String key) not exist"); return null; } public OutputStream getOutputStream(String url, String key) throws Exception { Logger.d("getOutputStream(String key)" + filePath + File.separator + key + "." + getImageSuffix(url) + ".temp"); File file = new File(filePath + File.separator + key + "." + getImageSuffix(url) + ".temp"); if (!file.getParentFile().exists()) file.getParentFile().mkdirs(); return new FileOutputStream(file); } public void deleteFile(String url, String key) { File file = new File(filePath + File.separator + key + "." + getImageSuffix(url)); if (file.exists()) file.delete(); } public void renameFile(String url, String key) { File file = new File(filePath + File.separator + key + "." + getImageSuffix(url) + ".temp"); File newFile = new File(filePath + File.separator + key + "." + getImageSuffix(url)); if (file.exists() && file.length() != 0) { // 2015-03-03 这里发现了一个bug,如果文件已经存在,且文件已经保存过了,但是保存的文件是异常的文件,如果再rename的话 // rename后的文件还是之前异常的文件,所以操作前简单的判断一下文件是否一致 if (newFile.exists() && newFile.length() != file.length()) { Logger.v(String.format("原文件已存在不匹配,先删除目标文件,临时文件长度%s, 目标文件长度%s", file.length() + "", newFile.length() + "")); newFile.delete(); } boolean renameResult = file.renameTo(newFile); } } private String getImageSuffix(String url) { return getImageSuffix(url, IMG_SUFFIX); } public static String getImageSuffix(String url, String suffix) { if ("auto".equals(suffix)) { try { String temp = url; temp = temp.toLowerCase(); if (temp.endsWith(".gif") || temp.endsWith(".jpg") || temp.endsWith(".jpeg") || temp.endsWith(".bmp") || temp.endsWith(".png")) { return url.substring(url.lastIndexOf(".") + 1, url.length()); } else { return "jpg"; } } catch (Exception e) { } } return suffix; } }