package com.wm.remusic.proxy.utils;
import android.content.Context;
import android.util.Log;
import com.wm.remusic.proxy.db.CacheFileInfoDao;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.URI;
public class ProxyFileUtils {
private static final String LOG_TAG = ProxyFileUtils.class.getSimpleName();
private static ProxyFileUtils fileUtilsByMediaPlayer;
private static ProxyFileUtils fileUtilsByPreLoader;
public static ProxyFileUtils getInstance(Context context, URI uri, boolean isUseByMediaPlayer) {
// 如果文件名有错误,返回空Utils
String name = getValidFileName(uri);
if (name == null || name.length() <= 0) {
ProxyFileUtils utils = new ProxyFileUtils(context, null);
utils.setEnableFalse();
return utils;
}
// 如果是预加载,如果MediaPlayer正在使用文件,则不预加载,返回空Utils
if (!isUseByMediaPlayer) {
if (fileUtilsByMediaPlayer != null && fileUtilsByMediaPlayer.getFileName().equals(name)) {
ProxyFileUtils utils = new ProxyFileUtils(context, null);
utils.setEnableFalse();
return utils;
}
}
// 创建Utils,关闭之前Util。如果是MediaPlayer使用文件Preloader也在使用,则关闭Preloader的Utils
if (isUseByMediaPlayer) {
if (fileUtilsByPreLoader != null && fileUtilsByPreLoader.getFileName().equals(name)) {
close(fileUtilsByPreLoader, false);
}
close(fileUtilsByMediaPlayer, true);
fileUtilsByMediaPlayer = new ProxyFileUtils(context, name);
return fileUtilsByMediaPlayer;
} else {
close(fileUtilsByPreLoader, false);
fileUtilsByPreLoader = new ProxyFileUtils(context, name);
return fileUtilsByPreLoader;
}
}
private boolean isEnable;
private FileOutputStream outputStream;
private RandomAccessFile randomAccessFile;
private File file;
/**
* 判断存储是否可用
*
* @return
*/
private boolean isSdAvaliable() {
// 判断外部存储器是否可用
File dir = new File(Constants.DOWNLOAD_PATH);
if (!dir.exists()) {
dir.mkdirs();
if (!dir.exists()) {
return false;
}
}
// 删除部分缓存文件
ProxyUtils.asynRemoveBufferFile(Constants.CACHE_FILE_NUMBER);
// 可用空间大小是否大于SD卡预留最小值
long freeSize = ProxyUtils.getAvailaleSize(Constants.DOWNLOAD_PATH);
if (freeSize > Constants.SD_REMAIN_SIZE) {
return true;
} else {
return false;
}
}
private ProxyFileUtils(Context context, String name) {
if (name == null || name.length() <= 0) {
isEnable = false;
return;
}
if (!isSdAvaliable()) {
isEnable = false;
return;
}
try {
//Log.e("path","/");
file = new File(context.getCacheDir().getPath() + name);
if (!file.exists()) {
File dir = new File(Constants.DOWNLOAD_PATH);
dir.mkdirs();
file.createNewFile();
}
randomAccessFile = new RandomAccessFile(file, "r");
outputStream = new FileOutputStream(file, true);
isEnable = true;
} catch (IOException e) {
isEnable = false;
Log.e(LOG_TAG, "文件操作失败,无SD?", e);
}
}
public String getFileName() {
return file.getName();
}
public boolean isEnable() {
return isEnable;
}
public void setEnableFalse() {
isEnable = false;
}
public int getLength() {
if (isEnable) {
return (int) file.length();
} else {
return -1;
}
}
public boolean delete() {
return file.delete();
}
public byte[] read(int startPos) {
if (isEnable) {
int byteCount = (int) (getLength() - startPos);
byte[] tmp = new byte[byteCount];
try {
randomAccessFile.seek(startPos);
randomAccessFile.read(tmp);
return tmp;
} catch (IOException e) {
Log.e(LOG_TAG, "缓存读取失败", e);
return null;
}
} else {
return null;
}
}
public byte[] read(int startPos, int length) {
if (isEnable) {
int byteCount = (int) (getLength() - startPos);
if (byteCount > length) {
byteCount = length;
}
byte[] tmp = new byte[byteCount];
try {
randomAccessFile.seek(startPos);
randomAccessFile.read(tmp);
return tmp;
} catch (IOException e) {
Log.e(LOG_TAG, "缓存读取失败", e);
return null;
}
} else {
return null;
}
}
public void write(byte[] buffer, int byteCount) {
if (isEnable) {
try {
outputStream.write(buffer, 0, byteCount);
outputStream.flush();
} catch (IOException e) {
Log.e(LOG_TAG, "缓存写入失败", e);
}
}
}
public static void close(ProxyFileUtils fileUtils, boolean isUseByMediaPlayer) {
if (isUseByMediaPlayer) {
if (fileUtilsByMediaPlayer != null && fileUtilsByMediaPlayer == fileUtils) {
fileUtilsByMediaPlayer.setEnableFalse();
fileUtilsByMediaPlayer = null;
}
} else {
if (fileUtilsByPreLoader != null && fileUtilsByPreLoader == fileUtils) {
fileUtilsByPreLoader.setEnableFalse();
fileUtilsByPreLoader = null;
}
}
}
public static void deleteFile(String url) {
URI uri = URI.create(url);
String name = getValidFileName(uri);
boolean isSuccess = new File(name).delete();
if (isSuccess) {
CacheFileInfoDao.getInstance().delete(name);
}
}
public static boolean isFinishCache(String url) {
URI uri = URI.create(url);
String name = getValidFileName(uri);
File f = new File(name);
if (!f.exists()) {
return false;
}
if (f.length() != CacheFileInfoDao.getInstance().getFileSize(name)) {
return false;
}
return true;
}
/**
* 获取有效的文件名
*
* @param url
* @return
*/
static protected String getValidFileName(URI uri) {
String path = uri.getRawPath();
String name = path.substring(path.lastIndexOf("/"));
name = name.replace("\\", "");
name = name.replace("/", "");
name = name.replace(":", "");
name = name.replace("*", "");
name = name.replace("?", "");
name = name.replace("\"", "");
name = name.replace("<", "");
name = name.replace(">", "");
name = name.replace("|", "");
name = name.replace(" ", "_"); // 前面的替换会产生空格,最后将其一并替换掉
return name;
}
}