All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.kits.FileKit Maven / Gradle / Ivy

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;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy