
dev.utils.common.FileUtils Maven / Gradle / Ivy
package dev.utils.common;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import dev.utils.DevFinal;
import dev.utils.JCLogUtils;
import dev.utils.common.encrypt.MD5Utils;
/**
* detail: 文件操作工具类
* @author Ttt
*/
public final class FileUtils {
private FileUtils() {
}
// 日志 TAG
private static final String TAG = FileUtils.class.getSimpleName();
/**
* 获取文件
* @param filePath 文件路径
* @return 文件 {@link File}
*/
public static File getFile(final String filePath) {
return getFileByPath(filePath);
}
/**
* 获取文件
* @param filePath 文件路径
* @param fileName 文件名
* @return 文件 {@link File}
*/
public static File getFile(
final String filePath,
final String fileName
) {
return (filePath != null && fileName != null) ? new File(filePath, fileName) : null;
}
/**
* 获取文件
* @param parent 文件路径
* @param fileName 文件名
* @return 文件 {@link File}
*/
public static File getFile(
final File parent,
final String fileName
) {
return (parent != null && fileName != null) ? new File(parent, fileName) : null;
}
/**
* 获取文件
* @param filePath 文件路径
* @return 文件 {@link File}
*/
public static File getFileByPath(final String filePath) {
return filePath != null ? new File(filePath) : null;
}
/**
* 获取路径, 并且进行创建目录
* @param filePath 存储目录
* @param fileName 文件名
* @return 文件 {@link File}
*/
public static File getFileCreateFolder(
final String filePath,
final String fileName
) {
// 防止不存在目录文件, 自动创建
createFolder(filePath);
// 返回处理过后的 File
return getFile(filePath, fileName);
}
/**
* 获取路径, 并且进行创建目录
* @param filePath 存储目录
* @param fileName 文件名
* @return 文件 {@link File}
*/
public static String getFilePathCreateFolder(
final String filePath,
final String fileName
) {
// 防止不存在目录文件, 自动创建
createFolder(filePath);
// 返回处理过后的 File
File file = getFile(filePath, fileName);
// 返回文件路径
return getAbsolutePath(file);
}
/**
* 判断某个文件夹是否创建, 未创建则创建 ( 纯路径无文件名 )
* @param dirPath 文件夹路径 ( 无文件名字. 后缀 )
* @return {@code true} success, {@code false} fail
*/
public static boolean createFolder(final String dirPath) {
return createFolder(getFileByPath(dirPath));
}
/**
* 判断某个文件夹是否创建, 未创建则创建 ( 纯路径无文件名 )
* @param file 文件夹路径 ( 无文件名字. 后缀 )
* @return {@code true} success, {@code false} fail
*/
public static boolean createFolder(final File file) {
if (file != null) {
try {
// 当这个文件夹不存在的时候则创建文件夹
if (!file.exists()) {
// 允许创建多级目录
return file.mkdirs();
}
return true;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "createFolder");
}
}
return false;
}
/**
* 创建文件夹目录 ( 可以传入文件名 )
* @param filePath 文件路径 + 文件名
* @return {@code true} success, {@code false} fail
*/
public static boolean createFolderByPath(final String filePath) {
return createFolderByPath(getFileByPath(filePath));
}
/**
* 创建文件夹目录 ( 可以传入文件名 )
* @param file 文件
* @return {@code true} success, {@code false} fail
*/
public static boolean createFolderByPath(final File file) {
// 创建文件夹 ( 如果失败才创建 )
if (file != null) {
if (file.exists()) {
return true;
} else if (!file.getParentFile().mkdirs()) {
return createFolder(file.getParent());
}
}
return false;
}
/**
* 创建多个文件夹, 如果不存在则创建
* @param filePaths 文件路径数组
* @return {@code true} success, {@code false} fail
*/
public static boolean createFolderByPaths(final String... filePaths) {
if (filePaths != null && filePaths.length != 0) {
for (String filePath : filePaths) {
createFolder(filePath);
}
return true;
}
return false;
}
/**
* 创建多个文件夹, 如果不存在则创建
* @param files 文件数组
* @return {@code true} success, {@code false} fail
*/
public static boolean createFolderByPaths(final File... files) {
if (files != null && files.length != 0) {
for (File file : files) {
createFolder(file);
}
return true;
}
return false;
}
// =
/**
* 判断目录是否存在, 不存在则判断是否创建成功
* @param dirPath 目录路径
* @return {@code true} 存在或创建成功, {@code false} 不存在或创建失败
*/
public static boolean createOrExistsDir(final String dirPath) {
return createOrExistsDir(getFileByPath(dirPath));
}
/**
* 判断目录是否存在, 不存在则判断是否创建成功
* @param file 文件
* @return {@code true} 存在或创建成功, {@code false} 不存在或创建失败
*/
public static boolean createOrExistsDir(final File file) {
// 如果存在, 是目录则返回 true, 是文件则返回 false, 不存在则返回是否创建成功
return file != null && (file.exists() ? file.isDirectory() : file.mkdirs());
}
/**
* 判断文件是否存在, 不存在则判断是否创建成功
* @param filePath 文件路径
* @return {@code true} 存在或创建成功, {@code false} 不存在或创建失败
*/
public static boolean createOrExistsFile(final String filePath) {
return createOrExistsFile(getFileByPath(filePath));
}
/**
* 判断文件是否存在, 不存在则判断是否创建成功
* @param file 文件
* @return {@code true} 存在或创建成功, {@code false} 不存在或创建失败
*/
public static boolean createOrExistsFile(final File file) {
if (file == null) return false;
// 如果存在, 是文件则返回 true, 是目录则返回 false
if (file.exists()) return file.isFile();
// 判断文件是否存在, 不存在则直接返回
if (!createOrExistsDir(file.getParentFile())) return false;
try {
// 存在, 则返回新的路径
return file.createNewFile();
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "createOrExistsFile");
return false;
}
}
/**
* 判断文件是否存在, 存在则在创建之前删除
* @param filePath 文件路径
* @return {@code true} 创建成功, {@code false} 创建失败
*/
public static boolean createFileByDeleteOldFile(final String filePath) {
return createFileByDeleteOldFile(getFileByPath(filePath));
}
/**
* 判断文件是否存在, 存在则在创建之前删除
* @param file 文件
* @return {@code true} 创建成功, {@code false} 创建失败
*/
public static boolean createFileByDeleteOldFile(final File file) {
if (file == null) return false;
// 文件存在并且删除失败返回 false
if (file.exists() && !file.delete()) return false;
// 创建目录失败返回 false
if (!createOrExistsDir(file.getParentFile())) return false;
try {
return file.createNewFile();
} catch (IOException e) {
JCLogUtils.eTag(TAG, e, "createFileByDeleteOldFile");
return false;
}
}
/**
* 通过文件后缀创建时间戳文件名
* @param extension 文件后缀 ( 有无 . 都行 )
* @return 时间戳文件名 ( 包含后缀 )
*/
public static String createTimestampFileName(final String extension) {
// 临时后缀名
String temp = StringUtils.clearSpace(extension);
if (StringUtils.isNotEmpty(temp)) {
temp = StringUtils.clearSEWiths(temp, ".");
if (StringUtils.isNotEmpty(temp)) {
return System.currentTimeMillis() + "." + temp;
}
}
return null;
}
/**
* 通过文件名创建时间戳文件名
* @param fileName 文件名
* @return 时间戳文件名 ( 包含后缀 )
*/
public static String createTimestampFileNameByName(final String fileName) {
return createTimestampFileName(FileUtils.getFileExtension(fileName));
}
/**
* 通过文件创建时间戳文件名
* @param file 文件
* @return 时间戳文件名 ( 包含后缀 )
*/
public static String createTimestampFileNameByFile(final File file) {
return createTimestampFileName(FileUtils.getFileExtension(file));
}
/**
* 通过文件路径创建时间戳文件名
* @param filePath 文件路径
* @return 时间戳文件名 ( 包含后缀 )
*/
public static String createTimestampFileNameByPath(final String filePath) {
return createTimestampFileName(FileUtils.getFileExtension(filePath));
}
// =
/**
* Path List 转 File List
* @param paths Path List
* @return File List
*/
public static List convertFiles(final List paths) {
return convertFiles(paths, true);
}
/**
* Path List 转 File List
* @param paths Path List
* @param ignore 是否忽略 null
* @return File List
*/
public static List convertFiles(
final List paths,
final boolean ignore
) {
List files = new ArrayList<>();
if (paths != null && !paths.isEmpty()) {
for (int i = 0, len = paths.size(); i < len; i++) {
String path = paths.get(i);
if (path == null) {
if (!ignore) files.add(null);
continue;
}
files.add(new File(path));
}
}
return files;
}
/**
* File List 转 Path List
* @param files File List
* @return Path List
*/
public static List convertPaths(final List files) {
return convertPaths(files, true);
}
/**
* File List 转 Path List
* @param files File List
* @param ignore 是否忽略 null
* @return Path List
*/
public static List convertPaths(
final List files,
final boolean ignore
) {
List paths = new ArrayList<>();
if (files != null && !files.isEmpty()) {
for (int i = 0, len = files.size(); i < len; i++) {
File file = files.get(i);
if (file == null) {
if (!ignore) paths.add(null);
continue;
}
paths.add(file.getAbsolutePath());
}
}
return paths;
}
// =
/**
* 获取文件路径
* @param file 文件
* @return 文件路径
*/
public static String getPath(final File file) {
return file != null ? file.getPath() : null;
}
/**
* 获取文件绝对路径
* @param file 文件
* @return 文件绝对路径
*/
public static String getAbsolutePath(final File file) {
return file != null ? file.getAbsolutePath() : null;
}
// =
/**
* 获取文件名
* @param file 文件
* @return 文件名
*/
public static String getName(final File file) {
return file != null ? file.getName() : null;
}
/**
* 获取文件名
* @param filePath 文件路径
* @return 文件名
*/
public static String getName(final String filePath) {
return getName(filePath, "");
}
/**
* 获取文件名
* @param filePath 文件路径
* @param defaultStr 默认字符串
* @return 文件名, 如果文件路径为 null 时, 返回默认字符串
*/
public static String getName(
final String filePath,
final String defaultStr
) {
return StringUtils.isEmpty(filePath) ? defaultStr : new File(filePath).getName();
}
/**
* 获取文件后缀名 ( 无 "." 单独后缀 )
* @param file 文件
* @return 文件后缀名 ( 无 "." 单独后缀 )
*/
public static String getFileSuffix(final File file) {
return getFileSuffix(getAbsolutePath(file));
}
/**
* 获取文件后缀名 ( 无 "." 单独后缀 )
* @param filePath 文件路径或文件名
* @return 文件后缀名 ( 无 "." 单独后缀 )
*/
public static String getFileSuffix(final String filePath) {
// 获取最后的索引
int lastIndexOf;
// 判断是否存在
if (filePath != null && (lastIndexOf = filePath.lastIndexOf('.')) != -1) {
String result = filePath.substring(lastIndexOf);
if (result.startsWith(".")) {
return result.substring(1);
}
return result;
}
return null;
}
/**
* 获取文件名 ( 无后缀 )
* @param file 文件
* @return 文件名 ( 无后缀 )
*/
public static String getFileNotSuffix(final File file) {
return getFileNotSuffix(getName(file));
}
/**
* 获取文件名 ( 无后缀 )
* @param filePath 文件路径
* @return 文件名 ( 无后缀 )
*/
public static String getFileNotSuffixToPath(final String filePath) {
return getFileNotSuffix(getName(filePath));
}
/**
* 获取文件名 ( 无后缀 )
* @param fileName 文件名
* @return 文件名 ( 无后缀 )
*/
public static String getFileNotSuffix(final String fileName) {
if (fileName != null) {
if (fileName.lastIndexOf('.') != -1) {
return fileName.substring(0, fileName.lastIndexOf('.'));
} else {
return fileName;
}
}
return null;
}
/**
* 获取路径中的不带扩展名的文件名
* @param file 文件
* @return 不带扩展名的文件名
*/
public static String getFileNameNoExtension(final File file) {
if (file == null) return null;
return getFileNameNoExtension(file.getPath());
}
/**
* 获取路径中的不带扩展名的文件名
* @param filePath 文件路径
* @return 不带扩展名的文件名
*/
public static String getFileNameNoExtension(final String filePath) {
if (StringUtils.isEmpty(filePath)) return filePath;
int lastPoi = filePath.lastIndexOf('.');
int lastSep = filePath.lastIndexOf(File.separator);
if (lastSep == -1) {
return (lastPoi == -1 ? filePath : filePath.substring(0, lastPoi));
}
if (lastPoi == -1 || lastSep > lastPoi) {
return filePath.substring(lastSep + 1);
}
return filePath.substring(lastSep + 1, lastPoi);
}
/**
* 获取路径中的文件扩展名
* @param file 文件
* @return 文件扩展名
*/
public static String getFileExtension(final File file) {
if (file == null) return null;
return getFileExtension(file.getPath());
}
/**
* 获取路径中的文件扩展名
* @param filePath 文件路径
* @return 文件扩展名
*/
public static String getFileExtension(final String filePath) {
if (StringUtils.isEmpty(filePath)) return filePath;
int lastPoi = filePath.lastIndexOf('.');
int lastSep = filePath.lastIndexOf(File.separator);
if (lastPoi == -1 || lastSep >= lastPoi) return "";
return filePath.substring(lastPoi + 1);
}
// =
/**
* 检查是否存在某个文件
* @param file 文件
* @return {@code true} yes, {@code false} no
*/
public static boolean isFileExists(final File file) {
return file != null && file.exists();
}
/**
* 检查是否存在某个文件
* @param filePath 文件路径
* @return {@code true} yes, {@code false} no
*/
public static boolean isFileExists(final String filePath) {
return isFileExists(getFileByPath(filePath));
}
/**
* 检查是否存在某个文件
* @param filePath 文件路径
* @param fileName 文件名
* @return {@code true} yes, {@code false} no
*/
public static boolean isFileExists(
final String filePath,
final String fileName
) {
return filePath != null && fileName != null && new File(filePath, fileName).exists();
}
/**
* 判断是否文件
* @param filePath 文件路径
* @return {@code true} yes, {@code false} no
*/
public static boolean isFile(final String filePath) {
return isFile(getFileByPath(filePath));
}
/**
* 判断是否文件
* @param file 文件
* @return {@code true} yes, {@code false} no
*/
public static boolean isFile(final File file) {
return file != null && file.exists() && file.isFile();
}
/**
* 判断是否文件夹
* @param filePath 文件路径
* @return {@code true} yes, {@code false} no
*/
public static boolean isDirectory(final String filePath) {
return isDirectory(getFileByPath(filePath));
}
/**
* 判断是否文件夹
* @param file 文件
* @return {@code true} yes, {@code false} no
*/
public static boolean isDirectory(final File file) {
return file != null && file.exists() && file.isDirectory();
}
/**
* 判断是否隐藏文件
* @param filePath 文件路径
* @return {@code true} yes, {@code false} no
*/
public static boolean isHidden(final String filePath) {
return isHidden(getFileByPath(filePath));
}
/**
* 判断是否隐藏文件
* @param file 文件
* @return {@code true} yes, {@code false} no
*/
public static boolean isHidden(final File file) {
return file != null && file.exists() && file.isHidden();
}
/**
* 判断是否隐藏文件
* @param file 文件
* @return {@code true} yes, {@code false} no
*/
public static boolean isHidden2(final File file) {
return isHidden2(getAbsolutePath(file));
}
/**
* 判断是否隐藏文件
* @param filePath 文件路径
* @return {@code true} yes, {@code false} no
*/
public static boolean isHidden2(final String filePath) {
if (filePath != null) {
String temp = filePath.replaceAll("/../..", "")
.replaceAll("\\...\\...", "")
.replaceAll("\\..\\..", "");
return temp.contains("\\.") || temp.contains("/.");
}
return false;
}
/**
* 是否 Build 文件、文件夹判断
* @param file 文件
* @return {@code true} yes, {@code false} no
*/
public static boolean isBuild(final File file) {
return isBuild(getAbsolutePath(file));
}
/**
* 是否 Build 文件、文件夹判断
* @param filePath 文件路径
* @return {@code true} yes, {@code false} no
*/
public static boolean isBuild(final String filePath) {
if (filePath != null) {
if (filePath.contains("\\build\\")) return true;
if (filePath.endsWith("\\build")) return true;
if (filePath.contains("/build")) return true;
return (filePath.contains("/build/"));
}
return false;
}
/**
* 文件是否可读
* @param filePath 文件路径
* @return {@code true} yes, {@code false} no
*/
public static boolean canRead(final String filePath) {
return canRead(getFileByPath(filePath));
}
/**
* 文件是否可读
* @param file 文件
* @return {@code true} yes, {@code false} no
*/
public static boolean canRead(final File file) {
return file != null && file.exists() && file.canRead();
}
/**
* 文件是否可写
* @param filePath 文件路径
* @return {@code true} yes, {@code false} no
*/
public static boolean canWrite(final String filePath) {
return canWrite(getFileByPath(filePath));
}
/**
* 文件是否可写
* @param file 文件
* @return {@code true} yes, {@code false} no
*/
public static boolean canWrite(final File file) {
return file != null && file.exists() && file.canWrite();
}
/**
* 文件是否可读写
* @param filePath 文件路径
* @return {@code true} yes, {@code false} no
*/
public static boolean canReadWrite(final String filePath) {
return canReadWrite(getFileByPath(filePath));
}
/**
* 文件是否可读写
* @param file 文件
* @return {@code true} yes, {@code false} no
*/
public static boolean canReadWrite(final File file) {
return file != null && file.exists() && file.canRead() && file.canWrite();
}
// =
/**
* 获取文件最后修改的毫秒时间戳
* @param filePath 文件路径
* @return 文件最后修改的毫秒时间戳
*/
public static long getFileLastModified(final String filePath) {
return getFileLastModified(getFileByPath(filePath));
}
/**
* 获取文件最后修改的毫秒时间戳
* @param file 文件
* @return 文件最后修改的毫秒时间戳
*/
public static long getFileLastModified(final File file) {
if (file == null) return 0L;
return file.lastModified();
}
/**
* 获取文件编码格式
* @param filePath 文件路径
* @return 文件编码格式
*/
public static String getFileCharsetSimple(final String filePath) {
return getFileCharsetSimple(getFileByPath(filePath));
}
/**
* 获取文件编码格式
* @param file 文件
* @return 文件编码格式
*/
public static String getFileCharsetSimple(final File file) {
if (!isFileExists(file)) return null;
int pos = 0;
InputStream is = null;
try {
is = new BufferedInputStream(new FileInputStream(file));
pos = (is.read() << 8) + is.read();
} catch (IOException e) {
JCLogUtils.eTag(TAG, e, "getFileCharsetSimple");
} finally {
CloseUtils.closeIOQuietly(is);
}
switch (pos) {
case 0xefbb:
return DevFinal.ENCODE.UTF_8;
case 0xfffe:
return DevFinal.ENCODE.UNICODE;
case 0xfeff:
return DevFinal.ENCODE.UTF_16BE;
default:
return DevFinal.ENCODE.GBK;
}
}
/**
* 获取文件行数
* @param filePath 文件路径
* @return 文件行数
*/
public static int getFileLines(final String filePath) {
return getFileLines(getFileByPath(filePath));
}
/**
* 获取文件行数 ( 比 readLine 要快很多 )
* @param file 文件
* @return 文件行数
*/
public static int getFileLines(final File file) {
if (!isFileExists(file)) return 0;
int lineCount = 1;
InputStream is = null;
try {
is = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[1024];
int readChars;
if (DevFinal.SYMBOL.NEW_LINE.endsWith("\n")) {
while ((readChars = is.read(buffer, 0, 1024)) != -1) {
for (int i = 0; i < readChars; ++i) {
if (buffer[i] == '\n') ++lineCount;
}
}
} else {
while ((readChars = is.read(buffer, 0, 1024)) != -1) {
for (int i = 0; i < readChars; ++i) {
if (buffer[i] == '\r') ++lineCount;
}
}
}
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "getFileLines");
} finally {
CloseUtils.closeIOQuietly(is);
}
return lineCount;
}
// =
/**
* 获取文件大小
* @param filePath 文件路径
* @return 文件大小
*/
public static String getFileSize(final String filePath) {
return getFileSize(getFileByPath(filePath));
}
/**
* 获取文件大小
* @param file 文件
* @return 文件大小
*/
public static String getFileSize(final File file) {
return formatByteMemorySize(getFileLength(file));
}
/**
* 获取目录大小
* @param dirPath 目录路径
* @return 文件大小
*/
public static String getDirSize(final String dirPath) {
return getDirSize(getFileByPath(dirPath));
}
/**
* 获取目录大小
* @param dir 目录
* @return 文件大小
*/
public static String getDirSize(final File dir) {
return formatByteMemorySize(getDirLength(dir));
}
/**
* 获取文件大小
* @param filePath 文件路径
* @return 文件大小
*/
public static long getFileLength(final String filePath) {
return getFileLength(getFileByPath(filePath));
}
/**
* 获取文件大小
* @param file 文件
* @return 文件大小
*/
public static long getFileLength(final File file) {
return file != null ? file.length() : 0L;
}
/**
* 获取目录全部文件大小
* @param dirPath 目录路径
* @return 目录全部文件大小
*/
public static long getDirLength(final String dirPath) {
return getDirLength(getFileByPath(dirPath));
}
/**
* 获取目录全部文件大小
* @param dir 目录
* @return 目录全部文件大小
*/
public static long getDirLength(final File dir) {
if (!isDirectory(dir)) return 0L;
long len = 0;
File[] files = dir.listFiles();
if (files != null && files.length != 0) {
for (File file : files) {
if (file.isDirectory()) {
len += getDirLength(file);
} else {
len += file.length();
}
}
}
return len;
}
/**
* 获取文件大小 ( 网络资源 )
* @param httpUri 文件网络链接
* @return 文件大小
*/
public static long getFileLengthNetwork(final String httpUri) {
if (StringUtils.isEmpty(httpUri)) return 0L;
// 判断是否网络资源
boolean isHttpRes = httpUri.toLowerCase().startsWith("http:") || httpUri.toLowerCase().startsWith("https:");
if (isHttpRes) {
try {
HttpURLConnection conn = (HttpURLConnection) new URL(httpUri).openConnection();
conn.setRequestProperty("Accept-Encoding", "identity");
conn.connect();
if (conn.getResponseCode() == 200) {
return conn.getContentLength();
}
return 0L;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "getFileLengthNetwork");
}
}
return 0L;
}
/**
* 获取路径中的文件名
* @param file 文件
* @return 文件名
*/
public static String getFileName(final File file) {
if (file == null) return null;
return getFileName(file.getPath());
}
/**
* 获取路径中的文件名
* @param filePath 文件路径
* @return 文件名
*/
public static String getFileName(final String filePath) {
if (StringUtils.isEmpty(filePath)) return filePath;
int lastSep = filePath.lastIndexOf(File.separator);
return lastSep == -1 ? filePath : filePath.substring(lastSep + 1);
}
/**
* 获取路径中的最长目录地址
* @param file 文件
* @return 最长目录地址
*/
public static String getDirName(final File file) {
if (file == null) return null;
return getDirName(file.getPath());
}
/**
* 获取全路径中的最长目录地址
* @param filePath 文件路径
* @return 最长目录地址
*/
public static String getDirName(final String filePath) {
if (StringUtils.isEmpty(filePath)) return filePath;
int lastSep = filePath.lastIndexOf(File.separator);
return lastSep == -1 ? "" : filePath.substring(0, lastSep + 1);
}
// =
/**
* 重命名文件 ( 同个目录下, 修改文件名 )
* @param filePath 文件路径
* @param newFileName 文件新名称
* @return {@code true} yes, {@code false} no
*/
public static boolean rename(
final String filePath,
final String newFileName
) {
return rename(getFileByPath(filePath), newFileName);
}
/**
* 重命名文件 ( 同个目录下, 修改文件名 )
* @param file 文件
* @param newFileName 文件新名称
* @return {@code true} yes, {@code false} no
*/
public static boolean rename(
final File file,
final String newFileName
) {
if (StringUtils.isEmpty(newFileName)) return false;
// 文件为空返回 false
if (file == null) return false;
// 文件不存在返回 false
if (!file.exists()) return false;
// 如果文件名没有改变返回 true
if (newFileName.equals(file.getName())) return true;
// 拼接新的文件路径
File newFile = new File(file.getParent() + File.separator + newFileName);
// 如果重命名的文件已存在返回 false
return !newFile.exists() && file.renameTo(newFile);
}
// =============
// = 文件大小处理 =
// =============
/**
* 传入文件路径, 返回对应的文件大小
* @param filePath 文件路径
* @return 文件大小转换字符串
*/
public static String formatFileSize(final String filePath) {
File file = getFileByPath(filePath);
return formatFileSize(file != null ? file.length() : 0);
}
/**
* 传入文件路径, 返回对应的文件大小
* @param file 文件
* @return 文件大小转换字符串
*/
public static String formatFileSize(final File file) {
return formatFileSize(file != null ? file.length() : 0);
}
/**
* 传入对应的文件大小, 返回转换后文件大小
* @param fileSize 文件大小
* @return 文件大小转换字符串
*/
public static String formatFileSize(final double fileSize) {
// 转换文件大小
DecimalFormat df = new DecimalFormat("#.00");
String fileSizeStr;
if (fileSize <= 0) {
fileSizeStr = "0B";
} else if (fileSize < 1024) {
fileSizeStr = df.format(fileSize) + "B";
} else if (fileSize < 1048576) {
fileSizeStr = df.format(fileSize / 1024) + "KB";
} else if (fileSize < 1073741824) {
fileSizeStr = df.format(fileSize / 1048576) + "MB";
} else if (fileSize < 1099511627776D) {
fileSizeStr = df.format(fileSize / 1073741824) + "GB";
} else {
fileSizeStr = df.format(fileSize / 1099511627776D) + "TB";
}
return fileSizeStr;
}
/**
* 字节数转合适内存大小 保留 3 位小数
* @param byteSize 字节数
* @return 合适内存大小字符串
*/
public static String formatByteMemorySize(final double byteSize) {
return formatByteMemorySize(3, byteSize);
}
/**
* 字节数转合适内存大小 保留 number 位小数
* @param number 保留小数位数
* @param byteSize 字节数
* @return 合适内存大小字符串
*/
public static String formatByteMemorySize(
final int number,
final double byteSize
) {
if (byteSize < 0D) {
return "0B";
} else if (byteSize < 1024D) {
return String.format("%." + number + "fB", byteSize);
} else if (byteSize < 1048576D) {
return String.format("%." + number + "fKB", byteSize / 1024D);
} else if (byteSize < 1073741824D) {
return String.format("%." + number + "fMB", byteSize / 1048576D);
} else if (byteSize < 1099511627776D) {
return String.format("%." + number + "fGB", byteSize / 1073741824D);
} else {
return String.format("%." + number + "fTB", byteSize / 1099511627776D);
}
}
// ==========
// = 文件操作 =
// ==========
/**
* 删除文件
* @param filePath 文件路径
* @return {@code true} success, {@code false} fail
*/
public static boolean deleteFile(final String filePath) {
return deleteFile(getFileByPath(filePath));
}
/**
* 删除文件
* @param file 文件
* @return {@code true} success, {@code false} fail
*/
public static boolean deleteFile(final File file) {
// 文件存在, 并且不是目录文件, 则直接删除
if (file != null && file.exists() && !file.isDirectory()) {
return file.delete();
}
return false;
}
/**
* 删除多个文件
* @param filePaths 文件路径数组
* @return {@code true} success, {@code false} fail
*/
public static boolean deleteFiles(final String... filePaths) {
if (filePaths != null && filePaths.length != 0) {
for (String filePath : filePaths) {
deleteFile(filePath);
}
return true;
}
return false;
}
/**
* 删除多个文件
* @param files 文件数组
* @return {@code true} success, {@code false} fail
*/
public static boolean deleteFiles(final File... files) {
if (files != null && files.length != 0) {
for (File file : files) {
deleteFile(file);
}
return true;
}
return false;
}
// =
/**
* 删除文件夹
* @param filePath 文件路径
* @return {@code true} success, {@code false} fail
*/
public static boolean deleteFolder(final String filePath) {
return deleteFolder(getFileByPath(filePath));
}
/**
* 删除文件夹
* @param file 文件
* @return {@code true} success, {@code false} fail
*/
public static boolean deleteFolder(final File file) {
if (file != null) {
try {
// 文件存在, 并且不是目录文件, 则直接删除
if (file.exists()) {
if (file.isDirectory()) { // 属于文件目录
File[] files = file.listFiles();
if (files != null) {
for (File deleteFile : files) {
deleteFolder(deleteFile.getPath());
}
}
return file.delete();
} else { // 属于文件
return deleteFile(file);
}
}
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "deleteFolder");
}
}
return false;
}
/**
* 保存文件
* @param filePath 文件路径
* @param data 待存储数据
* @return {@code true} success, {@code false} fail
*/
public static boolean saveFile(
final String filePath,
final byte[] data
) {
return saveFile(FileUtils.getFile(filePath), data);
}
/**
* 保存文件
* @param file 文件
* @param data 待存储数据
* @return {@code true} success, {@code false} fail
*/
public static boolean saveFile(
final File file,
final byte[] data
) {
if (file != null && data != null) {
FileOutputStream fos = null;
BufferedOutputStream bos = null;
try {
// 防止文件夹没创建
createFolder(getDirName(file));
// 写入文件
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
bos.write(data);
return true;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "saveFile");
} finally {
CloseUtils.closeIOQuietly(bos, fos);
}
}
return false;
}
/**
* 追加文件
* @param filePath 文件路径
* @param data 待追加数据
* @return {@code true} success, {@code false} fail
*/
public static boolean appendFile(
final String filePath,
final byte[] data
) {
return appendFile(FileUtils.getFile(filePath), data);
}
/**
* 追加文件
*
* 如果未创建文件, 则会创建并写入数据 ( 等同 {@link #saveFile} )
* 如果已创建文件, 则在结尾追加数据
*
* @param file 文件
* @param data 待追加数据
* @return {@code true} success, {@code false} fail
*/
public static boolean appendFile(
final File file,
final byte[] data
) {
FileOutputStream fos = null;
BufferedOutputStream bos = null;
try {
// 防止文件夹没创建
createFolder(getDirName(file));
// 写入文件
fos = new FileOutputStream(file, true);
bos = new BufferedOutputStream(fos);
bos.write(data);
return true;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "appendFile");
} finally {
CloseUtils.closeIOQuietly(bos, fos);
}
return false;
}
// =
/**
* 读取文件
* @param filePath 文件路径
* @return 文件内容 byte[]
*/
public static byte[] readFileBytes(final String filePath) {
return readFileBytes(getFileByPath(filePath));
}
/**
* 读取文件
* @param file 文件
* @return 文件内容 byte[]
*/
public static byte[] readFileBytes(final File file) {
if (file != null && file.exists()) {
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
int length = fis.available();
byte[] buffer = new byte[length];
fis.read(buffer);
return buffer;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "readFileBytes");
} finally {
CloseUtils.closeIOQuietly(fis);
}
}
return null;
}
/**
* 读取文件
* @param inputStream {@link InputStream}
* @return 文件内容 byte[]
*/
public static byte[] readFileBytes(final InputStream inputStream) {
if (inputStream != null) {
try {
int length = inputStream.available();
byte[] buffer = new byte[length];
inputStream.read(buffer);
return buffer;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "readFileBytes");
} finally {
CloseUtils.closeIOQuietly(inputStream);
}
}
return null;
}
/**
* 读取文件
*
* 获取换行内容可以通过
* {@link FileIOUtils#readFileToList(File)}
* {@link FileIOUtils#readFileToString(File)}
*
* @param filePath 文件路径
* @return 文件内容字符串
*/
public static String readFile(final String filePath) {
return readFile(getFileByPath(filePath));
}
/**
* 读取文件
* @param file 文件
* @return 文件内容字符串
*/
public static String readFile(final File file) {
if (file != null && file.exists()) {
try {
return readFile(new FileInputStream(file));
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "readFile");
}
}
return null;
}
/**
* 读取文件
* @param inputStream {@link InputStream} new FileInputStream(path)
* @return 文件内容字符串
*/
public static String readFile(final InputStream inputStream) {
return readFile(inputStream, null);
}
/**
* 读取文件
* @param inputStream {@link InputStream} new FileInputStream(path)
* @param encode 编码格式
* @return 文件内容字符串
*/
public static String readFile(
final InputStream inputStream,
final String encode
) {
if (inputStream != null) {
BufferedReader br = null;
try {
InputStreamReader isr;
if (encode != null) {
isr = new InputStreamReader(inputStream, encode);
} else {
isr = new InputStreamReader(inputStream);
}
br = new BufferedReader(isr);
StringBuilder builder = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
builder.append(line);
}
return builder.toString();
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "readFile");
} finally {
CloseUtils.closeIOQuietly(br);
}
}
return null;
}
// =
/**
* 复制单个文件
* @param inputStream 文件流 ( 被复制 )
* @param destFilePath 目标文件地址
* @param overlay 如果目标文件存在, 是否覆盖
* @return {@code true} success, {@code false} fail
*/
public static boolean copyFile(
final InputStream inputStream,
final String destFilePath,
final boolean overlay
) {
if (inputStream == null || destFilePath == null) {
return false;
}
File destFile = new File(destFilePath);
// 如果属于文件夹则跳过
if (destFile.isDirectory()) {
return false;
}
if (destFile.exists()) {
// 如果目标文件存在并允许覆盖
if (overlay) {
// 删除已经存在的目标文件, 无论目标文件是目录还是单个文件
destFile.delete();
} else { // 如果文件存在, 但是不覆盖, 则返回 false 表示失败
return false;
}
} else {
// 如果目标文件所在目录不存在, 则创建目录
if (!destFile.getParentFile().exists()) {
// 目标文件所在目录不存在
if (!destFile.getParentFile().mkdirs()) {
// 复制文件失败: 创建目标文件所在目录失败
return false;
}
}
}
// 复制文件
int len; // 读取的字节数
InputStream is = inputStream;
OutputStream os = null;
try {
os = new FileOutputStream(destFile);
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
return true;
} catch (Exception e) {
JCLogUtils.eTag(TAG, e, "copyFile");
return false;
} finally {
CloseUtils.closeIOQuietly(os, is);
}
}
/**
* 复制单个文件
* @param srcFilePath 待复制的文件地址
* @param destFilePath 目标文件地址
* @param overlay 如果目标文件存在, 是否覆盖
* @return {@code true} success, {@code false} fail
*/
public static boolean copyFile(
final String srcFilePath,
final String destFilePath,
final boolean overlay
) {
if (destFilePath == null) return false;
if (!FileUtils.isFile(srcFilePath)) return false;
return copyFile(
FileIOUtils.getFileInputStream(srcFilePath),
destFilePath, overlay
);
}
/**
* 复制文件夹
* @param srcFolderPath 待复制的文件夹地址
* @param destFolderPath 存储目标文件夹地址
* @param overlay 如果目标文件存在, 是否覆盖
* @return {@code true} success, {@code false} fail
*/
public static boolean copyFolder(
final String srcFolderPath,
final String destFolderPath,
final boolean overlay
) {
return copyFolder(srcFolderPath, destFolderPath, srcFolderPath, overlay);
}
/**
* 复制文件夹
* @param srcFolderPath 待复制的文件夹地址
* @param destFolderPath 存储目标文件夹地址
* @param sourcePath 源文件地址 ( 用于保递归留记录 )
* @param overlay 如果目标文件存在, 是否覆盖
* @return {@code true} success, {@code false} fail
*/
private static boolean copyFolder(
final String srcFolderPath,
final String destFolderPath,
final String sourcePath,
final boolean overlay
) {
if (srcFolderPath == null || destFolderPath == null || sourcePath == null) {
return false;
}
File srcFile = new File(srcFolderPath);
// 判断源文件是否存在
if (!srcFile.exists()) {
return false;
} else if (!srcFile.isDirectory()) { // 不属于文件夹则跳过
return false;
}
// 判断目标文件是否存在
File destFile = new File(destFolderPath);
// 如果文件夹没创建, 则创建
if (!destFile.exists()) {
// 允许创建多级目录
destFile.mkdirs();
}
// 判断是否属于文件夹 ( 不属于文件夹则跳过 )
if (!destFile.isDirectory()) {
return false;
}
// 判断是否存在
if (srcFile.exists()) {
// 获取文件路径
File[] files = srcFile.listFiles();
// 防止不存在文件
if (files != null && files.length != 0) {
// 进行遍历
for (File file : files) {
// 文件存在才进行处理
if (file.exists()) {
// 属于文件夹
if (file.isDirectory()) {
copyFolder(file.getAbsolutePath(), destFolderPath, sourcePath, overlay);
} else { // 属于文件
// 复制的文件地址
String filePath = file.getAbsolutePath();
// 获取源文件地址并且进行判断
String dealSource = new File(sourcePath).getAbsolutePath();
// 属于最前才进行处理
if (filePath.indexOf(dealSource) == 0) {
// 获取处理后的地址
dealSource = filePath.substring(dealSource.length());
// 获取需要复制保存的地址
String savePath = new File(destFolderPath, dealSource).getAbsolutePath();
// 进行复制文件
boolean result = copyFile(filePath, savePath, overlay);
}
}
}
}
}
}
return true;
}
// =
/**
* 移动 ( 剪切 ) 文件
* @param srcFilePath 待移动的文件地址
* @param destFilePath 目标文件地址
* @param overlay 如果目标文件存在, 是否覆盖
* @return {@code true} success, {@code false} fail
*/
public static boolean moveFile(
final String srcFilePath,
final String destFilePath,
final boolean overlay
) {
// 复制文件
if (copyFile(srcFilePath, destFilePath, overlay)) {
// 删除文件
return deleteFile(srcFilePath);
}
return false;
}
/**
* 移动 ( 剪切 ) 文件夹
* @param srcFilePath 待移动的文件夹地址
* @param destFilePath 存储目标文件夹地址
* @param overlay 如果目标文件存在, 是否覆盖
* @return {@code true} success, {@code false} fail
*/
public static boolean moveFolder(
final String srcFilePath,
final String destFilePath,
final boolean overlay
) {
// 复制文件夹
if (copyFolder(srcFilePath, destFilePath, overlay)) {
// 删除文件夹
return deleteFolder(srcFilePath);
}
return false;
}
// =
/**
* detail: 覆盖 / 替换事件
* @author Ttt
*/
public interface OnReplaceListener {
/**
* 是否覆盖 / 替换文件
* @return {@code true} yes, {@code false} no
*/
boolean onReplace();
}
/**
* 复制或移动目录
* @param srcDirPath 源目录路径
* @param destDirPath 目标目录路径
* @param listener 是否覆盖监听器
* @param isMove 是否移动
* @return {@code true} 复制或移动成功, {@code false} 复制或移动失败
*/
public static boolean copyOrMoveDir(
final String srcDirPath,
final String destDirPath,
final OnReplaceListener listener,
final boolean isMove
) {
return copyOrMoveDir(getFileByPath(srcDirPath), getFileByPath(destDirPath), listener, isMove);
}
/**
* 复制或移动目录
* @param srcDir 源目录
* @param destDir 目标目录
* @param listener 是否覆盖监听器
* @param isMove 是否移动
* @return {@code true} 复制或移动成功, {@code false} 复制或移动失败
*/
public static boolean copyOrMoveDir(
final File srcDir,
final File destDir,
final OnReplaceListener listener,
final boolean isMove
) {
if (srcDir == null || destDir == null || listener == null) return false;
// 为防止以上这种情况出现出现误判, 需分别在后面加个路径分隔符
String srcPath = srcDir.getPath() + File.separator;
String destPath = destDir.getPath() + File.separator;
if (destPath.contains(srcPath)) return false;
// 源文件不存在或者不是目录则返回 false
if (!srcDir.exists() || !srcDir.isDirectory()) return false;
if (destDir.exists()) {
if (listener.onReplace()) { // 需要覆盖则删除旧目录
if (!deleteAllInDir(destDir)) { // 删除文件失败的话返回 false
return false;
}
} else { // 不需要覆盖直接返回即可 true
return true;
}
}
// 目标目录不存在返回 false
if (!createOrExistsDir(destDir)) return false;
File[] files = srcDir.listFiles();
if (files == null) return false;
for (File file : files) {
File oneDestFile = new File(destPath + file.getName());
if (file.isFile()) {
// 如果操作失败返回 false
if (!copyOrMoveFile(file, oneDestFile, listener, isMove)) return false;
} else if (file.isDirectory()) {
// 如果操作失败返回 false
if (!copyOrMoveDir(file, oneDestFile, listener, isMove)) return false;
}
}
return !isMove || deleteDir(srcDir);
}
/**
* 复制或移动文件
* @param srcFilePath 源文件路径
* @param destFilePath 目标文件路径
* @param listener 是否覆盖监听器
* @param isMove 是否移动
* @return {@code true} 复制或移动成功, {@code false} 复制或移动失败
*/
public static boolean copyOrMoveFile(
final String srcFilePath,
final String destFilePath,
final OnReplaceListener listener,
final boolean isMove
) {
return copyOrMoveFile(
getFileByPath(srcFilePath),
getFileByPath(destFilePath),
listener, isMove
);
}
/**
* 复制或移动文件
* @param srcFile 源文件
* @param destFile 目标文件
* @param listener 是否覆盖监听器
* @param isMove 是否移动
* @return {@code true} 复制或移动成功, {@code false} 复制或移动失败
*/
public static boolean copyOrMoveFile(
final File srcFile,
final File destFile,
final OnReplaceListener listener,
final boolean isMove
) {
if (srcFile == null || destFile == null || listener == null) return false;
// 如果源文件和目标文件相同则返回 false
if (srcFile.equals(destFile)) return false;
// 源文件不存在或者不是文件则返回 false
if (!srcFile.exists() || !srcFile.isFile()) return false;
if (destFile.exists()) { // 目标文件存在
if (listener.onReplace()) { // 需要覆盖则删除旧文件
if (!destFile.delete()) { // 删除文件失败的话返回 false
return false;
}
} else { // 不需要覆盖直接返回即可 true
return true;
}
}
// 目标目录不存在返回 false
if (!createOrExistsDir(destFile.getParentFile())) return false;
try {
return FileIOUtils.writeFileFromIS(
destFile, new FileInputStream(srcFile), false
) && !(isMove && !deleteFile(srcFile));
} catch (FileNotFoundException e) {
JCLogUtils.eTag(TAG, e, "copyOrMoveFile");
return false;
}
}
/**
* 复制目录
* @param srcDirPath 源目录路径
* @param destDirPath 目标目录路径
* @param listener 是否覆盖监听器
* @return {@code true} 复制成功, {@code false} 复制失败
*/
public static boolean copyDir(
final String srcDirPath,
final String destDirPath,
final OnReplaceListener listener
) {
return copyDir(getFileByPath(srcDirPath), getFileByPath(destDirPath), listener);
}
/**
* 复制目录
* @param srcDir 源目录
* @param destDir 目标目录
* @param listener 是否覆盖监听器
* @return {@code true} 复制成功, {@code false} 复制失败
*/
public static boolean copyDir(
final File srcDir,
final File destDir,
final OnReplaceListener listener
) {
return copyOrMoveDir(srcDir, destDir, listener, false);
}
/**
* 复制文件
* @param srcFilePath 源文件路径
* @param destFilePath 目标文件路径
* @param listener 是否覆盖监听器
* @return {@code true} 复制成功, {@code false} 复制失败
*/
public static boolean copyFile(
final String srcFilePath,
final String destFilePath,
final OnReplaceListener listener
) {
return copyFile(getFileByPath(srcFilePath), getFileByPath(destFilePath), listener);
}
/**
* 复制文件
* @param srcFile 源文件
* @param destFile 目标文件
* @param listener 是否覆盖监听器
* @return {@code true} 复制成功, {@code false} 复制失败
*/
public static boolean copyFile(
final File srcFile,
final File destFile,
final OnReplaceListener listener
) {
return copyOrMoveFile(srcFile, destFile, listener, false);
}
/**
* 移动目录
* @param srcDirPath 源目录路径
* @param destDirPath 目标目录路径
* @param listener 是否覆盖监听器
* @return {@code true} 移动成功, {@code false} 移动失败
*/
public static boolean moveDir(
final String srcDirPath,
final String destDirPath,
final OnReplaceListener listener
) {
return moveDir(getFileByPath(srcDirPath), getFileByPath(destDirPath), listener);
}
/**
* 移动目录
* @param srcDir 源目录
* @param destDir 目标目录
* @param listener 是否覆盖监听器
* @return {@code true} 移动成功, {@code false} 移动失败
*/
public static boolean moveDir(
final File srcDir,
final File destDir,
final OnReplaceListener listener
) {
return copyOrMoveDir(srcDir, destDir, listener, true);
}
/**
* 移动文件
* @param srcFilePath 源文件路径
* @param destFilePath 目标文件路径
* @param listener 是否覆盖监听器
* @return {@code true} 移动成功, {@code false} 移动失败
*/
public static boolean moveFile(
final String srcFilePath,
final String destFilePath,
final OnReplaceListener listener
) {
return moveFile(getFileByPath(srcFilePath), getFileByPath(destFilePath), listener);
}
/**
* 移动文件
* @param srcFile 源文件
* @param destFile 目标文件
* @param listener 是否覆盖监听器
* @return {@code true} 移动成功, {@code false} 移动失败
*/
public static boolean moveFile(
final File srcFile,
final File destFile,
final OnReplaceListener listener
) {
return copyOrMoveFile(srcFile, destFile, listener, true);
}
/**
* 删除目录
* @param dirPath 目录路径
* @return {@code true} 删除成功, {@code false} 删除失败
*/
public static boolean deleteDir(final String dirPath) {
return deleteDir(getFileByPath(dirPath));
}
/**
* 删除目录
* @param dir 目录
* @return {@code true} 删除成功, {@code false} 删除失败
*/
public static boolean deleteDir(final File dir) {
if (dir == null) return false;
// dir doesn't exist then return true
if (!dir.exists()) return true;
// dir isn't a directory then return false
if (!dir.isDirectory()) return false;
File[] files = dir.listFiles();
if (files != null && files.length != 0) {
for (File file : files) {
if (file.isFile()) {
if (!file.delete()) return false;
} else if (file.isDirectory()) {
if (!deleteDir(file)) return false;
}
}
}
return dir.delete();
}
/**
* 删除目录下所有文件
* @param dirPath 目录路径
* @return {@code true} 删除成功, {@code false} 删除失败
*/
public static boolean deleteAllInDir(final String dirPath) {
return deleteAllInDir(getFileByPath(dirPath));
}
/**
* 删除目录下所有文件
* @param dir 目录
* @return {@code true} 删除成功, {@code false} 删除失败
*/
public static boolean deleteAllInDir(final File dir) {
return deleteFilesInDirWithFilter(dir, pathname -> true);
}
/**
* 删除目录下所有文件
* @param dirPath 目录路径
* @return {@code true} 删除成功, {@code false} 删除失败
*/
public static boolean deleteFilesInDir(final String dirPath) {
return deleteFilesInDir(getFileByPath(dirPath));
}
/**
* 删除目录下所有文件
* @param dir 目录
* @return {@code true} 删除成功, {@code false} 删除失败
*/
public static boolean deleteFilesInDir(final File dir) {
return deleteFilesInDirWithFilter(dir, pathname -> pathname.isFile());
}
/**
* 删除目录下所有过滤的文件
* @param dirPath 目录路径
* @param filter 过滤器
* @return {@code true} 删除成功, {@code false} 删除失败
*/
public static boolean deleteFilesInDirWithFilter(
final String dirPath,
final FileFilter filter
) {
return deleteFilesInDirWithFilter(getFileByPath(dirPath), filter);
}
/**
* 删除目录下所有过滤的文件
* @param dir 目录
* @param filter 过滤器
* @return {@code true} 删除成功, {@code false} 删除失败
*/
public static boolean deleteFilesInDirWithFilter(
final File dir,
final FileFilter filter
) {
if (filter == null) return false;
if (dir == null) return false;
if (!dir.exists()) return true;
if (!dir.isDirectory()) return false;
File[] files = dir.listFiles();
if (files != null && files.length != 0) {
for (File file : files) {
if (filter.accept(file)) {
if (file.isFile()) {
if (!file.delete()) return false;
} else if (file.isDirectory()) {
if (!deleteDir(file)) return false;
}
}
}
}
return true;
}
/**
* 获取目录下所有文件 ( 不递归进子目录 )
* @param dirPath 目录路径
* @return 文件链表
*/
public static List listFilesInDir(final String dirPath) {
return listFilesInDir(dirPath, false);
}
/**
* 获取目录下所有文件 ( 不递归进子目录 )
* @param dir 目录
* @return 文件链表
*/
public static List listFilesInDir(final File dir) {
return listFilesInDir(dir, false);
}
/**
* 获取目录下所有文件
* @param dirPath 目录路径
* @param isRecursive 是否递归进子目录
* @return 文件链表
*/
public static List listFilesInDir(
final String dirPath,
final boolean isRecursive
) {
return listFilesInDir(getFileByPath(dirPath), isRecursive);
}
/**
* 获取目录下所有文件
* @param dir 目录
* @param isRecursive 是否递归进子目录
* @return 文件链表
*/
public static List listFilesInDir(
final File dir,
final boolean isRecursive
) {
return listFilesInDirWithFilter(dir, pathname -> true, isRecursive);
}
/**
* 获取目录下所有过滤的文件 ( 不递归进子目录 )
* @param dirPath 目录路径
* @param filter 过滤器
* @return 文件链表
*/
public static List listFilesInDirWithFilter(
final String dirPath,
final FileFilter filter
) {
return listFilesInDirWithFilter(getFileByPath(dirPath), filter, false);
}
/**
* 获取目录下所有过滤的文件 ( 不递归进子目录 )
* @param dir 目录
* @param filter 过滤器
* @return 文件链表
*/
public static List listFilesInDirWithFilter(
final File dir,
final FileFilter filter
) {
return listFilesInDirWithFilter(dir, filter, false);
}
/**
* 获取目录下所有过滤的文件
* @param dirPath 目录路径
* @param filter 过滤器
* @param isRecursive 是否递归进子目录
* @return 文件链表
*/
public static List listFilesInDirWithFilter(
final String dirPath,
final FileFilter filter,
final boolean isRecursive
) {
return listFilesInDirWithFilter(getFileByPath(dirPath), filter, isRecursive);
}
/**
* 获取目录下所有过滤的文件
* @param dir 目录
* @param filter 过滤器
* @param isRecursive 是否递归进子目录
* @return 文件链表
*/
public static List listFilesInDirWithFilter(
final File dir,
final FileFilter filter,
final boolean isRecursive
) {
if (!isDirectory(dir) || filter == null) return null;
List list = new ArrayList<>();
File[] files = dir.listFiles();
if (files != null && files.length != 0) {
for (File file : files) {
if (filter.accept(file)) {
list.add(file);
}
if (isRecursive && file.isDirectory()) {
List fileLists = listFilesInDirWithFilter(file, filter, true);
if (fileLists != null) {
list.addAll(fileLists);
}
}
}
}
return list;
}
// =
/**
* detail: 文件列表
* @author Ttt
*/
public static class FileList {
// 当前文件夹
private final File mFile;
// 文件夹内子文件列表
private final List mSubFiles;
/**
* 构造函数
* @param file 当前文件夹
*/
public FileList(File file) {
this(file, new ArrayList<>(0));
}
/**
* 构造函数
* @param file 当前文件夹
* @param lists 文件夹内子文件列表
*/
public FileList(
File file,
List lists
) {
this.mFile = file;
this.mSubFiles = lists;
}
// =
/**
* 获取当前文件夹
* @return {@link File}
*/
public File getFile() {
return mFile;
}
/**
* 获取文件夹内子文件列表
* @return {@link List}
*/
public List getSubFiles() {
return mSubFiles;
}
}
// =
/**
* 获取目录下所有文件 ( 不递归进子目录 )
* @param dirPath 目录路径
* @return 文件链表
*/
public static List listFilesInDirBean(final String dirPath) {
return listFilesInDirBean(dirPath, false);
}
/**
* 获取目录下所有文件 ( 不递归进子目录 )
* @param dir 目录
* @return 文件链表
*/
public static List listFilesInDirBean(final File dir) {
return listFilesInDirBean(dir, false);
}
/**
* 获取目录下所有文件
* @param dirPath 目录路径
* @param isRecursive 是否递归进子目录
* @return 文件链表
*/
public static List listFilesInDirBean(
final String dirPath,
final boolean isRecursive
) {
return listFilesInDirBean(getFileByPath(dirPath), isRecursive);
}
/**
* 获取目录下所有文件
* @param dir 目录
* @param isRecursive 是否递归进子目录
* @return 文件链表
*/
public static List listFilesInDirBean(
final File dir,
final boolean isRecursive
) {
return listFilesInDirWithFilterBean(dir, pathname -> true, isRecursive);
}
/**
* 获取目录下所有过滤的文件 ( 不递归进子目录 )
* @param dirPath 目录路径
* @param filter 过滤器
* @return 文件链表
*/
public static List listFilesInDirWithFilterBean(
final String dirPath,
final FileFilter filter
) {
return listFilesInDirWithFilterBean(getFileByPath(dirPath), filter, false);
}
/**
* 获取目录下所有过滤的文件 ( 不递归进子目录 )
* @param dir 目录
* @param filter 过滤器
* @return 文件链表
*/
public static List listFilesInDirWithFilterBean(
final File dir,
final FileFilter filter
) {
return listFilesInDirWithFilterBean(dir, filter, false);
}
/**
* 获取目录下所有过滤的文件
* @param dirPath 目录路径
* @param filter 过滤器
* @param isRecursive 是否递归进子目录
* @return 文件链表
*/
public static List listFilesInDirWithFilterBean(
final String dirPath,
final FileFilter filter,
final boolean isRecursive
) {
return listFilesInDirWithFilterBean(getFileByPath(dirPath), filter, isRecursive);
}
/**
* 获取目录下所有过滤的文件
* @param dir 目录
* @param filter 过滤器
* @param isRecursive 是否递归进子目录
* @return 文件链表
*/
public static List listFilesInDirWithFilterBean(
final File dir,
final FileFilter filter,
final boolean isRecursive
) {
if (!isDirectory(dir) || filter == null) return null;
List list = new ArrayList<>();
File[] files = dir.listFiles();
if (files != null && files.length != 0) {
for (File file : files) {
if (filter.accept(file)) {
FileList fileList;
if (isRecursive && file.isDirectory()) {
List subs = listFilesInDirWithFilterBean(file, filter, true);
fileList = new FileList(file, subs);
} else {
fileList = new FileList(file);
}
list.add(fileList);
}
}
}
return list;
}
// =
/**
* 获取文件夹下的文件目录列表 ( 非全部子目录 )
* @param dirPath 目录路径
* @return 文件目录列表
*/
public static List listOrEmpty(final String dirPath) {
return listOrEmpty(getFile(dirPath));
}
/**
* 获取文件夹下的文件目录列表 ( 非全部子目录 )
* @param dir 目录
* @return 文件目录列表
*/
public static List listOrEmpty(final File dir) {
if (isFileExists(dir)) {
List list = ArrayUtils.asList(dir.list());
if (list != null) return list;
}
return new ArrayList<>();
}
// =
/**
* 获取文件夹下的文件目录列表 ( 非全部子目录 )
* @param dirPath 目录路径
* @return 文件目录列表
*/
public static List listFilesOrEmpty(final String dirPath) {
return listFilesOrEmpty(getFile(dirPath));
}
/**
* 获取文件夹下的文件目录列表 ( 非全部子目录 )
* @param dir 目录
* @return 文件目录列表
*/
public static List listFilesOrEmpty(final File dir) {
if (isFileExists(dir)) {
List list = ArrayUtils.asList(dir.listFiles());
if (list != null) return list;
}
return new ArrayList<>();
}
/**
* 获取文件夹下的文件目录列表 ( 非全部子目录 )
* @param dirPath 目录路径
* @param filter 文件过滤
* @return 文件目录列表
*/
public static List listFilesOrEmpty(
final String dirPath,
final FilenameFilter filter
) {
return listFilesOrEmpty(getFile(dirPath), filter);
}
/**
* 获取文件夹下的文件目录列表 ( 非全部子目录 )
* @param dir 目录
* @param filter 文件过滤
* @return 文件目录列表
*/
public static List listFilesOrEmpty(
final File dir,
final FilenameFilter filter
) {
if (isFileExists(dir)) {
List list = ArrayUtils.asList(dir.listFiles(filter));
if (list != null) return list;
}
return new ArrayList<>();
}
// =============
// = 图片类型判断 =
// =============
// 图片格式
private static final String[] IMAGE_FORMATS = {
".PNG", ".JPG", ".JPEG", ".BMP", ".GIF", ".WEBP"
};
/**
* 根据文件名判断文件是否为图片
* @param file 文件
* @return {@code true} yes, {@code false} no
*/
public static boolean isImageFormats(final File file) {
return file != null && isImageFormats(file.getPath(), IMAGE_FORMATS);
}
/**
* 根据文件名判断文件是否为图片
* @param filePath 文件路径
* @return {@code true} yes, {@code false} no
*/
public static boolean isImageFormats(final String filePath) {
return isImageFormats(filePath, IMAGE_FORMATS);
}
/**
* 根据文件名判断文件是否为图片
* @param filePath 文件路径
* @param fileFormats 文件格式
* @return {@code true} yes, {@code false} no
*/
public static boolean isImageFormats(
final String filePath,
final String[] fileFormats
) {
return isFileFormats(filePath, fileFormats);
}
// =============
// = 音频类型判断 =
// =============
// 音频格式
private static final String[] AUDIO_FORMATS = {
".MP3", ".AAC", ".OGG", ".WMA", ".APE", ".FLAC", ".RA"
};
/**
* 根据文件名判断文件是否为音频
* @param file 文件
* @return {@code true} yes, {@code false} no
*/
public static boolean isAudioFormats(final File file) {
return file != null && isAudioFormats(file.getPath(), AUDIO_FORMATS);
}
/**
* 根据文件名判断文件是否为音频
* @param filePath 文件路径
* @return {@code true} yes, {@code false} no
*/
public static boolean isAudioFormats(final String filePath) {
return isAudioFormats(filePath, AUDIO_FORMATS);
}
/**
* 根据文件名判断文件是否为音频
* @param filePath 文件路径
* @param fileFormats 文件格式
* @return {@code true} yes, {@code false} no
*/
public static boolean isAudioFormats(
final String filePath,
final String[] fileFormats
) {
return isFileFormats(filePath, fileFormats);
}
// =============
// = 视频类型判断 =
// =============
// 视频格式
private static final String[] VIDEO_FORMATS = {
".MP4", ".AVI", ".MOV", ".ASF", ".MPG", ".MPEG", ".WMV", ".RM", ".RMVB", ".3GP", ".MKV"
};
/**
* 根据文件名判断文件是否为视频
* @param file 文件
* @return {@code true} yes, {@code false} no
*/
public static boolean isVideoFormats(final File file) {
return file != null && isVideoFormats(file.getPath(), VIDEO_FORMATS);
}
/**
* 根据文件名判断文件是否为视频
* @param filePath 文件路径
* @return {@code true} yes, {@code false} no
*/
public static boolean isVideoFormats(final String filePath) {
return isVideoFormats(filePath, VIDEO_FORMATS);
}
/**
* 根据文件名判断文件是否为视频
* @param filePath 文件路径
* @param fileFormats 文件格式
* @return {@code true} yes, {@code false} no
*/
public static boolean isVideoFormats(
final String filePath,
final String[] fileFormats
) {
return isFileFormats(filePath, fileFormats);
}
// =
/**
* 根据文件名判断文件是否为指定格式
* @param file 文件
* @param fileFormats 文件格式
* @return {@code true} yes, {@code false} no
*/
public static boolean isFileFormats(
final File file,
final String[] fileFormats
) {
return file != null && isFileFormats(file.getPath(), fileFormats);
}
/**
* 根据文件名判断文件是否为指定格式
* @param filePath 文件路径
* @param fileFormats 文件格式
* @return {@code true} yes, {@code false} no
*/
public static boolean isFileFormats(
final String filePath,
final String[] fileFormats
) {
if (filePath == null || fileFormats == null || fileFormats.length == 0) return false;
String path = filePath.toUpperCase();
for (String format : fileFormats) {
if (format != null) {
if (path.endsWith(format.toUpperCase())) {
return true;
}
}
}
return false;
}
// ============
// = MD5Utils =
// ============
/**
* 获取文件 MD5 值
* @param filePath 文件路径
* @return 文件 MD5 值
*/
public static byte[] getFileMD5(final String filePath) {
return MD5Utils.getFileMD5(filePath);
}
/**
* 获取文件 MD5 值
* @param filePath 文件路径
* @return 文件 MD5 值转十六进制字符串
*/
public static String getFileMD5ToHexString(final String filePath) {
return MD5Utils.getFileMD5ToHexString(filePath);
}
/**
* 获取文件 MD5 值
* @param file 文件
* @return 文件 MD5 值转十六进制字符串
*/
public static String getFileMD5ToHexString(final File file) {
return MD5Utils.getFileMD5ToHexString(file);
}
/**
* 获取文件 MD5 值
* @param file 文件
* @return 文件 MD5 值 byte[]
*/
public static byte[] getFileMD5(final File file) {
return MD5Utils.getFileMD5(file);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy