io.github.kits.FileKit Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of whimthen-kits Show documentation
Show all versions of whimthen-kits Show documentation
Easy to use java tool library.
The newest version!
package io.github.kits;
import io.github.kits.enums.PropEnum;
import io.github.kits.log.Logger;
import io.github.kits.log.LoggerFomtter;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 文件操作工具类
*
* @project: kits
* @created: with IDEA
* @author: kits
* @date: 2018 04 26 下午3:12 | 四月. 星期四
*/
public class FileKit {
private static final Class thiClass = FileKit.class;
/**
* 判断文件是否为空
*
* @param file 文件
* @return 是否为空
*/
public static boolean isNullOrEmpty(File file) {
return null == file || !file.exists() || file.length() <= 0;
}
/**
* 判断文件是否不为空
*
* @param file 文件对象
* @return 是否为空
*/
public static boolean isNotNullOrEmpty(File file) {
return !isNullOrEmpty(file);
}
/**
* 读取加载文件到字节数组
*
* @param file 文件
* @return 读取的字节数组
*/
public static byte[] loadFile(File file) {
if (!file.exists()) {
return null;
}
try {
RandomAccessFile accessFile = new RandomAccessFile(file, "r");
accessFile.seek(0);
byte[] bytes = new byte[(int) accessFile.length()];
accessFile.read(bytes);
accessFile.close();
return bytes;
} catch (IOException e) {
Logger.error("Load file error", e);
return null;
}
}
/**
* 从文件或文件相对路径获取绝对路径
*
* @param fileOrPath 文件或文件的相对路径
* @return 绝对路径
*/
public static String getResourcePath(Object fileOrPath) {
String resource = null;
if (Objects.nonNull(fileOrPath)) {
if (fileOrPath instanceof File) {
return ((File) fileOrPath).getAbsolutePath();
} else if (fileOrPath instanceof String) {
URL url = thiClass.getClassLoader().getResource((String) fileOrPath);
if (Objects.nonNull(url)) {
resource = url.getFile();
}
}
}
return resource;
}
/**
* 从文件或文件相对路径获取绝对路径
*
* @param filePath 文件或文件的相对路径
* @return 绝对路径
*/
public static File getResourceFile(Object filePath) {
String resourcePath = getResourcePath(filePath);
if (StringKit.isNullOrEmpty(resourcePath)) {
System.out.println(LoggerFomtter.appendMessage(PropEnum.LOGGER_WARN.getProp(), ColorKit.toYellowBold(filePath + " not found."), false));
return null;
}
return new File(resourcePath);
}
/**
* 判断文件是否存在
*
* @param fullPath 文件完整路径
* @return 文件不存在(true)
*/
public static boolean fileNotExists(String fullPath){
return !fileExists(fullPath);
}
/**
* 判断文件是否存在
*
* @param fullPath 文件完整路径
* @return 文件存在(true)
*/
public static boolean fileExists(String fullPath){
if(fullPath.contains("!")){
fullPath = fullPath.substring(0, fullPath.indexOf("!"));
}
return new File(fullPath).exists();
}
/**
* 获得应用的工作根目录路径
*
* @return 工作空间的根据路径
*/
public static String getContentPath() {
return System.getProperty("user.dir");
}
/**
* 获取系统换行符
*
* @return 系统换行符
*/
public static String getLineSeparator() {
return System.getProperty("line.separator");
}
/**
* 获取文件名称
*
* @param path 文件路径
* @return 文件名称
*/
public static String getFileName(String path) {
return path.substring(path.contains(File.separator) ? path.lastIndexOf(File.separator) + 1 : 0, path.contains(".") ? path.lastIndexOf(".") : path.length());
}
/**
* 获取文件的扩展名
*
* @param filePath 文件的路径或者文件名
* @return 文件的扩展名
*/
public static String getFileExtension(String filePath){
try {
if (filePath.lastIndexOf(".") > 0) {
return filePath.substring(filePath.lastIndexOf(".") + 1);
} else {
return null;
}
} catch (IndexOutOfBoundsException e) {
return null;
}
}
/**
* 获取类JVM 的 Class Path
* 因部分 ide 会自动增加全部的 jvm 的 classpath, 所以这里会自动剔除 classpath 中 jvm 的 classPath
*
* @return 获得用户的类加载路径
*/
public static List getClassPath() {
ArrayList userClassPath = new ArrayList<>();
String javaHome = System.getProperty("java.home");
//去除 javahome 的最后一个路径节点,扩大搜索范文
javaHome = javaHome.replaceAll("\\/[a-zA-z0-9\\_\\$]*$", "");
String[] classPaths = System.getProperty("java.class.path").split(File.pathSeparator);
for (String classPath : classPaths) {
if (!classPath.startsWith(javaHome)) {
userClassPath.add(classPath);
}
}
return userClassPath;
}
/**
* 根据根目录获取目录下的文件
*
* @param rootFile 根目录
* @return 目录下的所有文件
*/
private static List getFiles(File rootFile) {
Set files = new HashSet<>();
if (rootFile.isDirectory()) {
for (File file : rootFile.listFiles()) {
files.addAll(getFiles(file));
}
} else {
files.add(rootFile);
}
return new ArrayList<>(files);
}
/**
* 遍历指定文件对象
*
* @param rootFile 特定的文件或文件目录
* @return 目录中的所有文件
*/
public static List scanFile(File rootFile) {
return getFiles(rootFile).stream()
.filter(file -> !StringKit.regexMatch(file.getAbsolutePath(), ".*\\.jar$"))
.collect(Collectors.toList());
}
/**
* 获取框架jar
*
* @return jar列表
*/
public static List findAgentJar(String... excludeAgentJar) {
List files = getClassPath();
return files.stream()
.filter(jarName -> isFrameJar(new File(jarName)))
.filter(jarName -> {
if (ListKit.isNotNullOrEmpty(Arrays.asList(excludeAgentJar))) {
return Stream.of(excludeAgentJar)
.parallel()
.map(jar -> jar.replace(".", "\\."))
.anyMatch(jar -> StringKit.regexFind(jar, jarName));
} else {
return true;
}
})
.collect(Collectors.toList());
}
/**
* 判断是否是同质jar
*
* @param jarFile
* @return
*/
public static boolean isFrameJar(File jarFile) {
return Objects.nonNull(jarFile) &&
jarFile.exists() &&
jarFile.isFile() &&
StringKit.regexFind(jarFile.getAbsolutePath(),
"whimthen-[a-zA-Z0-9_-]+-([0-9]+.[0-9]+.[0-9]+)-((RELEASE)|(SNAPSHOT))\\.jar$");
}
/**
* 遍历指定jar文件对象
* @param file jar文件对象
* @return 匹配到的文件对象集合
* @throws IOException IO 异常
*/
public static List scanJar(File file) throws IOException {
ArrayList result = new ArrayList<>();
JarFile jarFile = new JarFile(file);
Enumeration jarEntrys = jarFile.entries();
while(jarEntrys.hasMoreElements()){
JarEntry jarEntry = jarEntrys.nextElement();
result.add(jarEntry);
}
jarFile.close();
return result;
}
}