package com.netease.nim.uikit.common.util.file;
import android.graphics.Bitmap;
import android.text.TextUtils;
import com.netease.nim.uikit.common.util.log.LogUtil;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* 用于把附件保存到文件系统中
*/
public class AttachmentStore {
public static long copy(String srcPath, String dstPath) {
if (TextUtils.isEmpty(srcPath) || TextUtils.isEmpty(dstPath)) {
return -1;
}
File source = new File(srcPath);
if (!source.exists()) {
return -1;
}
if (srcPath.equals(dstPath)) {
return source.length();
}
FileChannel fcin = null;
FileChannel fcout = null;
try {
fcin = new FileInputStream(source).getChannel();
fcout = new FileOutputStream(create(dstPath)).getChannel();
ByteBuffer tmpBuffer = ByteBuffer.allocateDirect(4096);
while (fcin.read(tmpBuffer) != -1) {
tmpBuffer.flip();
fcout.write(tmpBuffer);
tmpBuffer.clear();
}
return source.length();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fcin != null) {
fcin.close();
}
if (fcout != null) {
fcout.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return -1;
}
public static long getFileLength(String srcPath) {
if (TextUtils.isEmpty(srcPath)) {
return -1;
}
File srcFile = new File(srcPath);
if (!srcFile.exists()) {
return -1;
}
return srcFile.length();
}
public static long save(String path, String content) {
return save(content.getBytes(), path);
}
/**
* 把数据保存到文件系统中,并且返回其大小
*
* @param data
* @param filePath
* @return 如果保存失败,则返回-1
*/
public static long save(byte[] data, String filePath) {
if (TextUtils.isEmpty(filePath)) {
return -1;
}
File f = new File(filePath);
if(f.getParentFile() == null) {
return -1;
}
if (!f.getParentFile().exists()) {// 如果不存在上级文件夹
f.getParentFile().mkdirs();
}
try {
f.createNewFile();
FileOutputStream fout = new FileOutputStream(f);
fout.write(data);
fout.close();
} catch (IOException e) {
e.printStackTrace();
return -1;
}
return f.length();
}
public static boolean move(String srcFilePath, String dstFilePath) {
if (TextUtils.isEmpty(srcFilePath) || TextUtils.isEmpty(dstFilePath)) {
return false;
}
File srcFile = new File(srcFilePath);
if (!srcFile.exists() || !srcFile.isFile()) {
return false;
}
File dstFile = new File(dstFilePath);
if(dstFile.getParentFile() == null) {
return false;
}
if (!dstFile.getParentFile().exists()) {// 如果不存在上级文件夹
dstFile.getParentFile().mkdirs();
}
return srcFile.renameTo(dstFile);
}
public static File create(String filePath) {
if (TextUtils.isEmpty(filePath)) {
return null;
}
File f = new File(filePath);
if (!f.getParentFile().exists()) {// 如果不存在上级文件夹
f.getParentFile().mkdirs();
}
try {
f.createNewFile();
return f;
} catch (IOException e) {
if(f!=null && f.exists()){
f.delete();
}
return null;
}
}
/**
* @param is
* @param filePath
* @return 保存失败,返回-1
*/
public static long save(InputStream is, String filePath) {
File f = new File(filePath);
if (!f.getParentFile().exists()) {// 如果不存在上级文件夹
f.getParentFile().mkdirs();
}
FileOutputStream fos = null;
try {
f.createNewFile();
fos = new FileOutputStream(f);
int read = 0;
byte[] bytes = new byte[8091];
while ((read = is.read(bytes)) != -1) {
fos.write(bytes, 0, read);
}
return f.length();
} catch (IOException e) {
if(f!=null && f.exists()){
f.delete();
}
LogUtil.e("file", "save is to " + filePath + " failed: " + e.getMessage());
return -1;
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 把文件从文件系统中读取出来
*
* @param path
* @return 如果无法读取,则返回null
*/
public static byte[] load(String path) {
try {
File f = new File(path);
int unread = (int) f.length();
int read = 0;
byte[] buf = new byte[unread]; // 读取文件长度
FileInputStream fin = new FileInputStream(f);
do {
int count = fin.read(buf, read, unread);
read += count;
unread -= count;
} while (unread != 0);
fin.close();
return buf;
} catch (FileNotFoundException e) {
return null;
} catch (IOException e) {
return null;
}
}
public static String loadAsString(String path) {
if (isFileExist(path)) {
byte[] content = load(path);
return new String(content);
} else {
return null;
}
}
/**
* 删除指定路径文件
*
* @param path
*/
public static boolean delete(String path) {
if(TextUtils.isEmpty(path)){
return false;
}
File f = new File(path);
if (f.exists()) {
f = renameOnDelete(f);
return f.delete();
} else {
return false;
}
}
public static void deleteOnExit(String path) {
if(TextUtils.isEmpty(path)){
return;
}
File f = new File(path);
if (f.exists()) {
f.deleteOnExit();
}
}
public static boolean deleteDir(String path) {
return deleteDir(path, true);
}
private static boolean deleteDir(String path, boolean rename) {
boolean success = true;
File file = new File(path);
if (file.exists()) {
if (rename) {
file = renameOnDelete(file);
}
File[] list = file.listFiles();
if (list != null) {
int len = list.length;
for (int i = 0; i < len; ++i) {
if (list[i].isDirectory()) {
deleteDir(list[i].getPath(), false);
} else {
boolean ret = list[i].delete();
if (!ret) {
success = false;
}
}
}
}
} else {
success = false;
}
if (success) {
file.delete();
}
return success;
}
// rename before delete to avoid lingering filesystem lock of android
private static File renameOnDelete(File file) {
String tmpPath = file.getParent() + "/" + System.currentTimeMillis() + "_tmp";
File tmpFile = new File(tmpPath);
if (file.renameTo(tmpFile)) {
return tmpFile;
} else {
return file;
}
}
public static boolean isFileExist(String path) {
if (!TextUtils.isEmpty(path) && new File(path).exists()) {
return true;
}
else {
return false;
}
}
public static boolean saveBitmap(Bitmap bitmap, String path, boolean recyle) {
if (bitmap == null || TextUtils.isEmpty(path)) {
return false;
}
BufferedOutputStream bos = null;
try {
FileOutputStream fos = new FileOutputStream(path);
bos = new BufferedOutputStream(fos);
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);
return true;
} catch (FileNotFoundException e) {
return false;
} finally {
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
}
}
if (recyle) {
bitmap.recycle();
}
}
}
}