JAVA文件类工具


FileUtil


package cn.jiangzeyin.util.file;

import org.springframework.util.Assert;

import java.io.*;
import java.math.BigDecimal;
import java.util.LinkedList;
import java.util.Properties;

/**
 * 文件操作工具类
 *
 * @author jiangzeyin
 */
public final class FileUtil {

    /**
     * @param path path
     * @return p
     * @throws IOException io
     * @author jiangzeyin
     */
    public static Properties getProperties(String path) throws IOException {
        Properties prop = new Properties();
        InputStream in = new FileInputStream(path);
        prop.load(in);
        return prop;
    }

    /**
     * 格式化单位
     *
     * @param size size
     * @return str
     */
    public static String getFormatSize(long size) {
        double kiloByte = size / 1024;
        if (kiloByte < 1) {
            return size + "Byte";
        }

        double megaByte = kiloByte / 1024;
        if (megaByte < 1) {
            BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
            return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "KB";
        }

        double gigaByte = megaByte / 1024;
        if (gigaByte < 1) {
            BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
            return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "MB";
        }

        double teraBytes = gigaByte / 1024;
        if (teraBytes < 1) {
            BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
            return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB";
        }
        BigDecimal result4 = new BigDecimal(teraBytes);
        return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB";
    }

    /**
     * 判断文件是否存在
     *
     * @param path path
     * @return boolean
     */
    public static boolean exists(String path) {
        File f = new File(path);
        return f.exists();
    }

    /**
     * 创建文件路径
     *
     * @param path path
     * @return boolean
     * @author jiangzeyin
     */
    public static boolean mkdirs(String path) {
        return mkdirs(new File(path), path.endsWith("/"));
    }

    /**
     * @param file   file
     * @param isPath isPath
     * @return boolean
     * @author jiangzeyin
     */
    public static boolean mkdirs(File file, boolean isPath) {
        if (file == null)
            return false;
        if (isPath)
            return file.mkdirs();
        else
            return file.getParentFile().mkdirs();
    }

    public static boolean mkdirs(File file) {
        return mkdirs(file, false);
    }

    /**
     * 读取文件全部内容
     *
     * @param file     file
     * @param encoding encoding
     * @return str
     * @throws IOException io
     */
    public static String readToString(File file, String encoding) throws IOException {
        BufferedReader br;
        StringBuffer stringBuffer = null;
        br = new BufferedReader(new InputStreamReader(new FileInputStream(file), encoding));
        String line = null;
        stringBuffer = new StringBuffer();
        while ((line = br.readLine()) != null) {
            stringBuffer.append(line);
        }
        br.close();
        return stringBuffer.toString();// 返回文件内容,默认编码
    }

    public static String readToString(File file) throws IOException {
        return readToString(file, "UTF-8");
    }

    public static String getFileEncode(String path) throws IOException {
        String charset = "asci";
        byte[] first3Bytes = new byte[3];

        boolean checked = false;
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
        bis.mark(0);
        int read = bis.read(first3Bytes, 0, 3);
        if (read == -1)
            return charset;
        if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE) {
            charset = "Unicode";// UTF-16LE
            checked = true;
        } else if (first3Bytes[0] == (byte) 0xFE && first3Bytes[1] == (byte) 0xFF) {
            charset = "Unicode";// UTF-16BE
            checked = true;
        } else if (first3Bytes[0] == (byte) 0xEF && first3Bytes[1] == (byte) 0xBB && first3Bytes[2] == (byte) 0xBF) {
            charset = "UTF8";
            checked = true;
        }
        bis.reset();
        if (!checked) {
            while ((read = bis.read()) != -1) {
                if (read >= 0xF0)
                    break;
                if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBK
                    break;
                if (0xC0 <= read && read <= 0xDF) {
                    read = bis.read();
                    if (0x80 <= read && read <= 0xBF)
                        // 双字节 (0xC0 - 0xDF) (0x80 - 0xBF),也可能在GB编码内
                        continue;
                    else
                        break;
                } else if (0xE0 <= read && read <= 0xEF) { // 也有可能出错,但是几率较小
                    read = bis.read();
                    if (0x80 <= read && read <= 0xBF) {
                        read = bis.read();
                        if (0x80 <= read && read <= 0xBF) {
                            charset = "UTF-8";
                            break;
                        } else
                            break;
                    } else
                        break;
                }
            }
            // TextLogger.getLogger().info(loc + " " +
            // Integer.toHexString(read));
        }
        bis.close();
        return charset;
    }

    public static String readFile(String path) throws IOException {
        // 判断文件是否存在
        File file = new File(path);
        if (!file.exists()) {
            return null;
        }
        String data = null;
        // 获取文件编码格式
        String code = FileUtil.getFileEncode(path);
        InputStreamReader isr = null;
        // 根据编码格式解析文件
        if ("asci".equals(code)) {
            // 这里采用GBK编码,而不用环境编码格式,因为环境默认编码不等于操作系统编码
            // code = System.getProperty("file.encoding");
            code = "GBK";
        }
        isr = new InputStreamReader(new FileInputStream(file), code);
        // 读取文件内容
        int length = -1;
        char[] buffer = new char[1024];
        StringBuffer sb = new StringBuffer();
        while ((length = isr.read(buffer, 0, 1024)) != -1) {
            sb.append(buffer, 0, length);
        }
        data = new String(sb);
        isr.close();
        return data;
    }

    /**
     * 读取文件
     *
     * @param fileName fileName
     * @param encoding encoding
     * @return strng
     * @throws Exception e
     * @author jiangzeyin
     */
    public static String readToString(String fileName, String encoding) throws Exception {
        File file = new File(fileName);
        Long filelength = file.length();
        byte[] filecontent = new byte[filelength.intValue()];
        FileInputStream in = new FileInputStream(file);
        in.read(filecontent);
        in.close();
        return new String(filecontent, encoding);
    }

    /**
     * 读取文件全部内容
     * <p>
     * 默认为UTF-8
     *
     * @param fileName fileName
     * @return str
     * @throws Exception e
     * @author jiangzeyin
     */
    public static String readToString(String fileName) throws Exception {
        return readToString(fileName, "UTF-8");
    }

    /**
     * 写文件
     *
     * @param fileName fileName
     * @param content  content
     * @throws IOException io
     * @author jiangzeyin
     */
    public static void writeFile(String fileName, String content) throws IOException {
        appendFileContext(fileName, content, false);
    }

    /**
     * 添加文件内容
     *
     * @param fileName file
     * @param content  c
     * @throws IOException io
     * @author jiangzeyin
     */
    public static void appendFileContext(String fileName, String content) throws IOException {
        appendFileContext(fileName, content, true);
    }

    /**
     * 追加文件内容
     *
     * @param fileName fileName
     * @param content  c
     * @param append   是否是追加
     * @throws IOException io
     * @author jiangzeyin
     */
    public static void appendFileContext(String fileName, String content, boolean append) throws IOException {
        File file = new File(fileName);
        file.getParentFile().mkdirs();
        Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF8"));
        if (content != null)
            out.write(content);
        out.close();
    }

    public static boolean writeInputStream(InputStream inputStream, String path) throws IOException {
        return writeInputStream(inputStream, new File(path));
    }    /**
     * @param inputStream inp
     * @param file        file
     * @return boolean
     * @throws IOException io
     */
    public static boolean writeInputStream(InputStream inputStream, File file) throws IOException {
        Assert.notNull(inputStream);
        Assert.notNull(file);
        mkdirs(file);
        DataOutputStream outputStream = null;
        try {
            outputStream = new DataOutputStream(new FileOutputStream(file));
            int len = inputStream.available();
            //判断长度是否大于1M
            if (len <= 1024 * 1024) {
                byte[] bytes = new byte[len];
                inputStream.read(bytes);
                outputStream.write(bytes);
            } else {
                int byteCount = 0;
                //1M逐个读取
                byte[] bytes = new byte[1024 * 1024];
                while ((byteCount = inputStream.read(bytes)) != -1) {
                    outputStream.write(bytes, 0, byteCount);
                }
            }
        } finally {
            if (inputStream != null)
                inputStream.close();
            if (outputStream != null)
                outputStream.close();
        }
        return true;
    }

    /**
     * 判断流的字符串格式
     *
     * @param ins ins
     * @return str
     * @throws IOException io
     */
    public static String getCharset(InputStream ins) throws IOException {
        BufferedInputStream bin = new BufferedInputStream(ins);
        int p = (bin.read() << 8) + bin.read();
        String code = null;
        switch (p) {
            case 0xefbb:
                code = "UTF-8";
                break;
            case 0xfffe:
                code = "Unicode";
                break;
            case 0xfeff:
                code = "UTF-16BE";
                break;
            default:
                code = "GBK";
        }
        ins.close();
        bin.close();
        return code;
    }

    /**
     * 获取文件 编码
     *
     * @param fileName fileName
     * @return str
     * @throws IOException io
     * @author jiangzeyin
     */
    public static String getFileCharset(String fileName) throws IOException {
        FileInputStream ins = new FileInputStream(fileName);
        return getCharset(ins);
    }    public static String getFilePath(String path) {
        File file = new File(path);
        return getFilePath(file);
    }

    public static String getFilePath(File file) {
        return clearPath(file.getParent());
    }

    /**
     * 获取文件后缀
     *
     * @param filename file
     * @return str
     * @author jiangzeyin
     */
    public static String getFileExt(String filename) {
        String ext = "";
        int index = filename.lastIndexOf(".");
        if (index == -1) {
            return "";
        }
        ext = filename.substring(index + 1);
        return ext;
    }

    public static String clearPath(String input) {
        input = input.replace('\\', '/');
        return clearPath_(input);
    }

    /**
     * 获取文件名
     *
     * @param filename file
     * @return s
     * @author jiangzeyin
     */
    public static String getFileName(String filename) {
        String ext = "";
        int index = filename.lastIndexOf("/");
        if (index == -1) {
            return filename;
        }
        ext = filename.substring(index + 1);
        return ext;
    }

    private static String clearPath_(String input) {
        int from = 0;
        int j = input.indexOf("://");
        if (j != -1) {
            from = j + 3;
        }
        int i = input.indexOf("//", from);
        if (i == -1) {
            return input;
        }

        String input_ = input.substring(0, i) + "/" + input.substring(i + 2);
        return clearPath_(input_);
    }

    /**
     * 递归删除目录下的所有文件及子目录下所有文件
     *
     * @param dir 将要删除的文件目录
     * @return boolean Returns "true" if all deletions were successful. If a
     * deletion fails, the method stops attempting to delete and returns
     * "false".
     */
    public static boolean deleteDir(File dir) {
        if (dir.isDirectory()) {
            String[] children = dir.list();
            // 递归删除目录中的子目录下
            for (int i = 0; i < (children != null ? children.length : 0); i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }
        // 目录此时为空,可以删除
        return dir.delete();
    }

    /**
     * 获取指定目录下的所有文件
     *
     * @param path path
     * @return LinkedList
     * @author XiangZhongBao
     */
    public static LinkedList<File> getFolderFiles(String path) {
        File file = new File(path);
        if (!file.exists())
            return null;
        if (!file.isDirectory())
            return null;
        File[] files = file.listFiles();
        if (files == null)
            return null;
        LinkedList<File> linkedList = new LinkedList<>();
        for (File item : files) {
            if (item.isDirectory()) {
                LinkedList<File> tempFile = getFolderFiles(item.getPath());
                if (tempFile != null)
                    linkedList.addAll(tempFile);
            } else {
                linkedList.add(item);
            }
        }
        return linkedList;
    }

    /**
     * @param dir dir
     * @return boolean
     * @author jiangzeyin
     */
    public static boolean deleteDir(String dir) {
        return deleteDir(new File(dir));
    }
}



FileType


package cn.jiangzeyin.util.file;

/**
 * Created by jiangzeyin on 2017/3/15.
 */
public enum FileType {

    /**
     * JPEG
     */
    JPEG("FFD8FF", "jpg"),

    /**
     * PNG
     */
    PNG("89504E47", "png"),

    /**
     * GIF
     */
    GIF("47494638", "gif"),

    /**
     * TIFF
     */
    TIFF("49492A00"),

    /**
     * Windows bitmap
     */
    BMP("424D"),

    /**
     * CAD
     */
    DWG("41433130"),

    /**
     * Adobe photoshop
     */
    PSD("38425053"),

    /**
     * Rich Text Format
     */
    RTF("7B5C727466"),

    /**
     * XML
     */
    XML("3C3F786D6C"),

    /**
     * HTML
     */
    HTML("68746D6C3E"),

    /**
     * Outlook Express
     */
    DBX("CFAD12FEC5FD746F "),

    /**
     * Outlook
     */
    PST("2142444E"),

    /**
     * doc;xls;dot;ppt;xla;ppa;pps;pot;msi;sdw;db
     */
    OLE2("0xD0CF11E0A1B11AE1"),

    /**
     * Microsoft Word/Excel
     */
    XLS_DOC("D0CF11E0"),

    /**
     * Microsoft Access
     */
    MDB("5374616E64617264204A"),

    /**
     * Word Perfect
     */
    WPB("FF575043"),

    /**
     * Postscript
     */
    EPS_PS("252150532D41646F6265"),

    /**
     * Adobe Acrobat
     */
    PDF("255044462D312E"),

    /**
     * Windows Password
     */
    PWL("E3828596"),

    /**
     * ZIP Archive
     */
    ZIP("504B0304"),

    /**
     * ARAR Archive
     */
    RAR("52617221"),

    /**
     * WAVE
     */
    WAV("57415645"),

    /**
     * AVI
     */
    AVI("41564920"),

    /**
     * Real Audio
     */
    RAM("2E7261FD"),

    /**
     * Real Media
     */
    RM("2E524D46"),

    /**
     * Quicktime
     */
    MOV("6D6F6F76"),

    /**
     * Windows Media
     */
    ASF("3026B2758E66CF11"),

    /**
     * MIDI
     */
    MID("4D546864");

    private String value = "";
    private String ext = "";

    FileType(String value) {
        this.value = value;
    }

    FileType(String value, String ext) {
        this(value);
        this.ext = ext;
    }

    public String getExt() {
        return ext;
    }

    public String getValue() {
        return value;
    }

}


FileStreamUtil


package cn.jiangzeyin.util;

import cn.jiangzeyin.util.file.FileType;
import org.springframework.util.Assert;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * Created by jiangzeyin on 2017/3/15.
 */
public abstract class FileStreamUtil {

    /**
     * 复制Input流
     *
     * @param input inp
     * @return inp
     * @throws Exception e
     * @author jiangzeyin
     */
    public static InputStream copyInputStream(InputStream input) throws Exception {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        while ((len = input.read(buffer)) > -1) {
            byteArrayOutputStream.write(buffer, 0, len);
        }
        byteArrayOutputStream.flush();
        //input = new ByteArrayInputStream(baos.toByteArray());
        InputStream stream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
        return stream;
    }

    /**
     * @param is is
     * @return fileType
     * @throws IOException io
     * @author jiangzeyin
     */
    public static FileType getFileType(InputStream is) throws IOException {
        Assert.notNull(is);
        byte[] src = new byte[28];
        is.read(src, 0, 28);
        StringBuilder stringBuilder = new StringBuilder("");
        if (src.length <= 0) {
            return null;
        }
        for (byte aSrc : src) {
            int v = aSrc & 0xFF;
            String hv = Integer.toHexString(v).toUpperCase();
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        //System.out.println(stringBuilder);
        FileType[] fileTypes = FileType.values();
        for (FileType fileType : fileTypes) {
            if (stringBuilder.toString().startsWith(fileType.getValue())) {
                return fileType;
            }
        }
        return null;
    }
}

posted @ 2019-01-03 14:00  大天狗子  阅读(446)  评论(0编辑  收藏  举报