package com.minggo.pluto.util;
import android.content.Context;
import android.os.Environment;
import android.os.StatFs;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
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.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
/**
* 文件操作类
* @author minggo
* @time 2014-12-2下午2:16:19
*/
public class FileUtils {
/**
* 写文件
* @param filePath
* @param fileName
* @param content
* @param append 是否添加在原内容的后边
* @return
*/
public static boolean WriterTxtFile(String filePath, String fileName,
String content,boolean append) {
String strFile = filePath + "/" + fileName;
File file = new File(strFile);
// 判断目录是否存在。如不存在则创建一个目录
file = new File(filePath);
if (!file.exists()) {
file.mkdirs();
}
file = new File(strFile);
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream out;
try {
out = new FileOutputStream(strFile, append);
out.write(content.getBytes("UTF-8"));
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}// true表示在文件末尾添加
catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
/**
* 写文件
* 若文件存在则返回
* @param filePath
* @param fileName
* @param content
* @param append 是否添加在原内容的后边
* @return
*/
public static boolean WriterTxtFileReturn(String filePath, String fileName,
String content,boolean append) {
String strFile = filePath + "/" + fileName;
File file = new File(strFile);
// 判断目录是否存在。如不存在则创建一个目录
file = new File(filePath);
if (!file.exists()) {
file.mkdirs();
}
file = new File(strFile);
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
} else {
return true;
}
FileOutputStream out;
try {
out = new FileOutputStream(strFile, append);
out.write(content.getBytes("UTF-8"));
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}// true表示在文件末尾添加
catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
/**
* 读取文本文件中的内容
* @param strFilePath 文件详细路径
* @return
*/
public static String ReadTxtFile(String strFilePath) {
String content = ""; // 文件内容字符串
// 打开文件
File file = new File(strFilePath);
// 如果path是传递过来的参数,可以做一个非目录的判断
if (!file.isDirectory()&&file.exists()) {
try {
InputStream instream = new FileInputStream(file);
if (instream != null) {
InputStreamReader inputreader = new InputStreamReader(instream);
BufferedReader buffreader = new BufferedReader(inputreader);
String line;
// 分行读取
while ((line = buffreader.readLine()) != null) {
if(strFilePath.contains("ggid")){
content += line;
}else{
content += line + "\n";
}
}
instream.close();
}
} catch (FileNotFoundException e) {
// Log.d("TestFile", "The File doesn't not exist.");
} catch (IOException e) {
// Log.d("TestFile", e.getMessage());
}
}
return content;
}
/**
* 读取文本文件中的内容
* @param strFilePath 文件详细路径
* @return
*/
public static String RemoveTxtFile(String strFilePath) {
String content = ""; // 文件内容字符串
// 打开文件
File file = new File(strFilePath);
// 如果path是传递过来的参数,可以做一个非目录的判断
if (file.exists()){
file.delete();
}
return content;
}
/**
* 读取文本文件中的内容
* @param strFilePath 文件详细路径
* @return
*/
public static String ReadTxtFileForBookids(String strFilePath) {
String content = ""; // 文件内容字符串
// 打开文件
File file = new File(strFilePath);
// 如果path是传递过来的参数,可以做一个非目录的判断
if (!file.isDirectory()) {
try {
InputStream instream = new FileInputStream(file);
if (instream != null) {
InputStreamReader inputreader = new InputStreamReader(instream);
BufferedReader buffreader = new BufferedReader(inputreader);
String line;
// 分行读取
while ((line = buffreader.readLine()) != null) {
content += line;
}
instream.close();
}
} catch (FileNotFoundException e) {
// Log.d("TestFile", "The File doesn't not exist.");
} catch (IOException e) {
// Log.d("TestFile", e.getMessage());
}
}
return content;
}
/**
* 读取文件
* @param inputStream
* @return
*/
public static String ReadTxtFile(InputStream inputStream) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte buf[] = new byte[1024];
int len;
try {
while ((len = inputStream.read(buf)) != -1) {
outputStream.write(buf, 0, len);
}
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
return outputStream.toString();
}
/**
* 根据文件绝对路径获取文件名
* @param filePath
* @return
*/
public static String getFileName( String filePath )
{
if( StringUtils.isEmpty(filePath) ) return "";
return filePath.substring(filePath.lastIndexOf(File.separator) + 1);
}
/**
* 根据文件的绝对路径获取文件名但不包含扩展名
* @param filePath
* @return
*/
public static String getFileNameNoFormat( String filePath){
if(StringUtils.isEmpty(filePath)){
return "";
}
int point = filePath.lastIndexOf('.');
return filePath.substring(filePath.lastIndexOf(File.separator)+1,point);
}
/**
* 获取文件扩展名
* @param fileName
* @return
*/
public static String getFileFormat( String fileName )
{
if( StringUtils.isEmpty(fileName) ) return "";
int point = fileName.lastIndexOf( '.' );
return fileName.substring( point+1 );
}
/**
* 获取文件大小
* @param filePath
* @return
*/
public static long getFileSize( String filePath )
{
long size = 0;
File file = new File( filePath );
if(file!=null && file.exists())
{
size = file.length();
}
return size;
}
/**
* 获取文件大小
* @param size 字节
* @return
*/
public static String getFileSize(long size)
{
if (size <= 0) return "0";
java.text.DecimalFormat df = new java.text.DecimalFormat("##.##");
float temp = (float)size / 1024;
if (temp >= 1024)
{
return df.format(temp / 1024) + "M";
}
else
{
return df.format(temp) + "K";
}
}
/**
* 转换文件大小
* @param fileS
* @return B/KB/MB/GB
*/
public static String formatFileSize(long fileS) {
java.text.DecimalFormat df = new java.text.DecimalFormat("#.00");
String fileSizeString = "";
if (fileS < 1024) {
fileSizeString = df.format((double) fileS) + "B";
} else if (fileS < 1048576) {
fileSizeString = df.format((double) fileS / 1024) + "KB";
} else if (fileS < 1073741824) {
fileSizeString = df.format((double) fileS / 1048576) + "MB";
} else {
fileSizeString = df.format((double) fileS / 1073741824) + "G";
}
return fileSizeString;
}
/**
* 获取目录文件大小
* @param dir
* @return
*/
public static long getDirSize(File dir) {
if (dir == null) {
return 0;
}
if (!dir.isDirectory()) {
return 0;
}
long dirSize = 0;
File[] files = dir.listFiles();
for (File file : files) {
if (file.isFile()) {
dirSize += file.length();
} else if (file.isDirectory()) {
dirSize += file.length();
dirSize += getDirSize(file); //递归调用继续统计
}
}
return dirSize;
}
/**
* 获取目录文件个数
* @param dir
* @return
*/
public long getFileList(File dir){
long count = 0;
File[] files = dir.listFiles();
count = files.length;
for (File file : files) {
if (file.isDirectory()) {
count = count + getFileList(file);//递归
count--;
}
}
return count;
}
public static byte[] toBytes(InputStream in) throws IOException
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
int ch;
while ((ch = in.read()) != -1)
{
out.write(ch);
}
byte buffer[]=out.toByteArray();
out.close();
return buffer;
}
/**
* 检查文件是否存在
* @param filepath
* @return
*/
public static boolean checkFileExists(String filepath) {
boolean status;
if (!filepath.equals("")) {
File newPath = new File(filepath);
status = newPath.exists();
} else {
status = false;
}
return status;
}
/**
* 计算SD卡的剩余空间
* @return 返回-1,说明没有安装sd卡
*/
public static long getFreeDiskSpace() {
String status = Environment.getExternalStorageState();
long freeSpace = 0;
if (status.equals(Environment.MEDIA_MOUNTED)) {
try {
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
freeSpace = availableBlocks * blockSize / 1024;
} catch (Exception e) {
e.printStackTrace();
}
} else {
return -1;
}
return (freeSpace);
}
/**
* 新建目录
* @param directoryName
* @return
*/
public static boolean createDirectory(String directoryName) {
boolean status;
if (!directoryName.equals("")) {
File path = Environment.getExternalStorageDirectory();
File newPath = new File(path.toString() + directoryName);
status = newPath.mkdir();
status = true;
} else
status = false;
return status;
}
/**
* 检查是否安装SD卡
* @return
*/
public static boolean checkSaveLocationExists() {
String sDCardStatus = Environment.getExternalStorageState();
boolean status;
if (sDCardStatus.equals(Environment.MEDIA_MOUNTED)) {
status = true;
} else
status = false;
return status;
}
/**
* 删除目录(包括:目录里的所有文件)
* @param fileName
* @return
*/
public static boolean deleteDirectory(String fileName) {
boolean status;
SecurityManager checker = new SecurityManager();
if (!fileName.equals("")) {
File path = Environment.getExternalStorageDirectory();
File newPath = new File(path.toString() + fileName);
checker.checkDelete(newPath.toString());
if (newPath.isDirectory()) {
String[] listfile = newPath.list();
// delete all files within the specified directory and then
// delete the directory
try {
for (int i = 0; i < listfile.length; i++) {
File deletedFile = new File(newPath.toString() + "/"
+ listfile[i].toString());
deletedFile.delete();
}
newPath.delete();
LogUtils.info("DirectoryManager deleteDirectory", fileName);
status = true;
} catch (Exception e) {
e.printStackTrace();
status = false;
}
} else
status = false;
} else
status = false;
return status;
}
/**
* 删除文件
* @param fileName
* @return
*/
public static boolean deleteFile(String fileName) {
boolean status;
SecurityManager checker = new SecurityManager();
if (!fileName.equals("")) {
File path = Environment.getExternalStorageDirectory();
File newPath = new File(path.toString() + fileName);
checker.checkDelete(newPath.toString());
if (newPath.isFile()) {
try {
newPath.delete();
status = true;
} catch (SecurityException se) {
se.printStackTrace();
status = false;
}
} else
status = false;
} else
status = false;
return status;
}
/**
* 删除SD卡中的文件
* @param strFilePath
* @return
*/
public static boolean deleteSDFile(String strFilePath){
if (strFilePath.equals("")) {
return false;
}
File file = new File(strFilePath);
return file.exists()&&file.delete();
}
/**
* 获取文件修改时间,失败为0
*/
public static long getLastModified(String filePath) {
File file = new File(filePath);
return file.lastModified();
}
/**
* 复制单个文件
* @param oldPath String 原文件路径 如:c:/fqf.txt
* @param newPath String 复制后路径 如:f:/fqf.txt
* @return boolean
*/
public static void copyFile(String oldPath, String newPath) {
InputStream inStream = null;
try {
int bytesum = 0;
int byteread = 0;
File oldfile = new File(oldPath);
if (oldfile.exists()) { //文件存在时
inStream = new FileInputStream(oldPath); //读入原文件
FileOutputStream fs = new FileOutputStream(newPath);
byte[] buffer = new byte[1444];
int length;
while ( (byteread = inStream.read(buffer)) != -1) {
bytesum += byteread; //字节数 文件大小
System.out.println(bytesum);
fs.write(buffer, 0, byteread);
}
}
} catch (Exception e) {
System.out.println("复制单个文件操作出错");
e.printStackTrace();
} finally {
if (inStream != null){
try {
inStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 获取path目录下所有文件名
* @param path 文件夹目录
* @return 文件名列表
*/
public static List<String> getDirsFileNames(String path){
List<String> fileNames = new ArrayList<String>();
File dir = new File(path);
if (dir.exists() && dir.isDirectory()) {
File[] files = dir.listFiles();
for (File file : files) {
fileNames.add(file.getName());
}
}
return fileNames;
}
/**
* 外部存储files子目录
* <br>/storage/emulated/0/Android/data/com.mengmengda.reader/files/dirType</br>
*
* @param dirType files子目录,null则为files目录
*/
public static File getExternalFilesDir(Context context, String dirType) {
return context.getExternalFilesDir(dirType);
}
/**
* 外部存储cache目录
* <br>/storage/emulated/0/Android/data/com.mengmengda.reader/cache</br>
*/
public static File getExternalCacheDir(Context context) {
return context.getExternalCacheDir();
}
}