package cm.android.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import android.content.Context; import android.content.res.AssetManager; import android.os.StatFs; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /** * IO读写Util类 */ public class AndroidIoUtil { private static final Logger logger = LoggerFactory.getLogger(AndroidIoUtil.class); private AndroidIoUtil() { } /** * 判断目录是否可用, 已经挂载并且拥有可读可写权限 true 可用 */ public static boolean isDirectoryValid(String path) { File file = new File(path); if (!file.canWrite()) { return false; } StatFs sf = new StatFs(file.getPath()); long availCount = sf.getAvailableBlocks(); if (availCount > 0) { return true; } return false; } /** * 移动资源配置文件至制定路径 */ public static void copyRes(Context context, File destFile, int res) { if (destFile.exists()) { return; } InputStream inputStream = null; OutputStream outputStream = null; try { cm.java.util.IoUtil.createFile(destFile); inputStream = new BufferedInputStream(context.getResources() .openRawResource(res)); outputStream = new BufferedOutputStream(new FileOutputStream(destFile)); cm.java.util.IoUtil.write(inputStream, outputStream); } catch (IOException e) { logger.error("destFile = " + destFile, e); } finally { cm.java.util.IoUtil.closeQuietly(inputStream); cm.java.util.IoUtil.closeQuietly(outputStream); } } /** * 移动APK文件至制定路径 */ public static void writeApkToPhone(Context context, String fileName, int res) { InputStream inputStream = null; OutputStream outputStream = null; try { if (cm.java.util.IoUtil.isFileExist(fileName)) { return; } cm.java.util.IoUtil.createFile(new File(fileName)); inputStream = new BufferedInputStream(context.getResources() .openRawResource(res)); outputStream = new BufferedOutputStream(context.openFileOutput( fileName, Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE)); cm.java.util.IoUtil.write(inputStream, outputStream); } catch (IOException e) { logger.error("fileName = " + fileName, e); } finally { cm.java.util.IoUtil.closeQuietly(inputStream); cm.java.util.IoUtil.closeQuietly(outputStream); } } /** * 移动Assets目录下的文件 */ public static void copyAssetFiles(Context context, String assetPath, File dir) { if (cm.java.util.IoUtil.getFiles(dir).length != 0) { return; } AssetManager assetManager = context.getAssets(); String[] files = null; try { files = assetManager.list(assetPath); } catch (IOException e) { logger.error("assetPath = " + assetPath, e); return; } for (String strSvy : files) { String filePath = assetPath + File.separator + strSvy; copyAssetFile(assetManager, filePath, new File(dir, strSvy)); } } public static boolean copyAssetFile(AssetManager assetManager, String fileName, File destFile) { InputStream inputStream = null; OutputStream outputStream = null; try { inputStream = new BufferedInputStream(assetManager.open(fileName)); outputStream = new BufferedOutputStream(new FileOutputStream(destFile)); cm.java.util.IoUtil.write(inputStream, outputStream); return true; } catch (IOException e) { logger.error("fileName = {},destFile = {},e = {}", fileName, destFile, e); return false; } finally { cm.java.util.IoUtil.closeQuietly(inputStream); cm.java.util.IoUtil.closeQuietly(outputStream); } } /** * 拷贝用户目录下文件到指定路径 * * @param srcName The name of the file to open; can not contain path separators. */ public static void copyPrivateFile(Context context, String srcName, File destFile) { InputStream inputStream = null; OutputStream outputStream = null; try { inputStream = new BufferedInputStream( context.openFileInput(srcName)); outputStream = new BufferedOutputStream(new FileOutputStream( destFile)); cm.java.util.IoUtil.write(inputStream, outputStream); } catch (IOException e) { logger.error("srcName = " + srcName + ",destFile = " + destFile.getAbsolutePath(), e); } finally { cm.java.util.IoUtil.closeQuietly(inputStream); cm.java.util.IoUtil.closeQuietly(outputStream); } } /** * 把srcFilePath写入/data/data/<包名>/files/目录下 */ public static boolean writeToDataDir(String srcFilePath, String destFileName, Context context) { InputStream inputStream = null; OutputStream outputStream = null; try { inputStream = new BufferedInputStream(new FileInputStream( srcFilePath)); outputStream = new BufferedOutputStream(context.openFileOutput( destFileName, Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE)); cm.java.util.IoUtil.write(inputStream, outputStream); return true; } catch (Exception e) { logger.error("srcFilePath = " + srcFilePath + ",destFileName = " + destFileName, e); return false; } finally { cm.java.util.IoUtil.closeQuietly(inputStream); cm.java.util.IoUtil.closeQuietly(outputStream); } } }