• jfinal 字节流存储文件以及解、压缩工具类



    import com.jfinal.ext.kit.DateKit;
    import com.jfinal.kit.PathKit;
    import com.jfinal.kit.PropKit;
    import com.jfinal.kit.StrKit;
    import com.jfinal.log.Log;
    import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
    import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;
    import sun.misc.BASE64Decoder;

    import javax.servlet.http.HttpServletResponse;
    import java.io.*;
    import java.util.*;
    import java.util.zip.*;

    /**
    * 文件和目录相关
    *
    */
    public abstract class ToolDirFile {

    private static final Log log = Log.getLog(ToolDirFile.class);

    private static String libPath;
    private static String classesPath;

    /**
    * 获取lib目录
    *
    * @return
    */
    public static String getLibPath() {
    if (libPath == null) {
    libPath = PathKit.getWebRootPath() + File.separator + "WEB-INF" + File.separator + "lib";
    }
    return libPath;
    }

    /**
    * 获取classes目录
    *
    * @return
    */
    public static String getClassesPath() {
    if (classesPath == null) {
    /**
    * 1.兼容运行模式 直接运行 JFinalConfig 中的 main 方法 maven: 直接运行 JFinalConfig 中的
    * main 方法 maven: jetty:run maven: tomcat7:run
    */
    // classesPath = PathKit.getRootClassPath();

    /**
    * 2.兼容jboss war部署
    */
    classesPath = PathKit.getWebRootPath() + File.separator + "WEB-INF" + File.separator + "classes";
    }
    return classesPath;
    }

    /**
    * 获取classes路径
    *
    * @return
    */
    @SuppressWarnings("rawtypes")
    public static String getClassesPath(Class classs) {
    String classRootPath = classs.getClassLoader().getResource("").getFile();
    try {
    classRootPath = java.net.URLDecoder.decode(classRootPath, "UTF-8");
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    if(log.isErrorEnabled()) log.error("初始化加载sql:获取classRootPath异常");
    }
    return classRootPath;
    }

    /**
    * 获取当前代码所在行
    *
    * @return
    */
    public static String getLineNumber() {
    StackTraceElement ste = new Throwable().getStackTrace()[1];
    return ste.getFileName() + ": Line " + ste.getLineNumber();
    }

    /**
    * 获取目录下的文件名称,不包含子目录名称
    *
    * @param dirPath
    * @return
    */
    public static List<String> getDirFileNames(String dirPath) {
    List<String> nameList = new ArrayList<String>();
    File file = new File(dirPath);
    File[] files = file.listFiles();
    for (File fileTemp : files) {
    if (!fileTemp.isDirectory()) {
    nameList.add(fileTemp.getName());
    }
    }
    return nameList;
    }

    /**
    * 复制文件夹或文件
    *
    * @param source
    * @param target
    * @throws IOException
    */
    public static void copyDir(String source, String target) throws IOException {
    (new File(source)).mkdirs();
    // 获取源文件夹当前下的文件或目录
    File[] file = (new File(source)).listFiles();
    for (int i = 0; i < file.length; i++) {
    if (file[i].isFile()) {
    // 复制文件
    copyFile(file[i], new File(target + file[i].getName()));
    }
    if (file[i].isDirectory()) {
    // 复制目录
    String sourceDir = source + File.separator + file[i].getName();
    String targetDir = target + File.separator + file[i].getName();
    copyDirectiory(sourceDir, targetDir);
    }
    }
    }

    /**
    * copy文件或目录
    *
    * @param source
    * @param target
    */
    public static void lovecopy(String source, String target) {
    // (new File(url2)).mkdirs();
    File f = new File(target);
    if (!f.exists()) {
    f.mkdirs();
    }

    // 获取源文件夹当前下的文件或目录
    File[] file = (new File(source)).listFiles();
    for (int i = 0; i < file.length; i++) {
    if (file[i].isFile()) {
    // 复制文件
    try {
    copyFile(file[i], new File(target + file[i].getName()));
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    if (file[i].isDirectory()) {
    // 复制目录
    String sourceDir = source + File.separator + file[i].getName();
    String targetDir = target + File.separator + file[i].getName();
    try {
    copyDirectiory(sourceDir, targetDir);
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }

    /**
    * 复制文件
    *
    * @param sourceFile
    * @param targetFile
    * @throws IOException
    */
    public static void copyFile(File sourceFile, File targetFile) throws IOException {
    // 新建文件输入流并对它进行缓冲
    FileInputStream input = new FileInputStream(sourceFile);
    BufferedInputStream inBuff = new BufferedInputStream(input);

    // 新建文件输出流并对它进行缓冲
    FileOutputStream output = new FileOutputStream(targetFile);
    BufferedOutputStream outBuff = new BufferedOutputStream(output);

    // 缓冲数组
    byte[] b = new byte[1024 * 5];
    int len;
    while ((len = inBuff.read(b)) != -1) {
    outBuff.write(b, 0, len);
    }
    // 刷新此缓冲的输出流
    outBuff.flush();

    // 关闭流
    inBuff.close();
    outBuff.close();
    output.close();
    input.close();
    }

    /**
    * 复制文件夹
    *
    * @param sourceDir
    * @param targetDir
    * @throws IOException
    */
    public static void copyDirectiory(String sourceDir, String targetDir) throws IOException {
    // 新建目标目录
    (new File(targetDir)).mkdirs();
    // 获取源文件夹当前下的文件或目录
    File[] file = (new File(sourceDir)).listFiles();
    for (int i = 0; i < file.length; i++) {
    if (file[i].isFile()) {
    // 源文件
    File sourceFile = file[i];
    // 目标文件
    File targetFile = new File(new File(targetDir).getAbsolutePath() + File.separator + file[i].getName());
    copyFile(sourceFile, targetFile);
    }
    if (file[i].isDirectory()) {
    // 准备复制的源文件夹
    String dir1 = sourceDir + "/" + file[i].getName();
    // 准备复制的目标文件夹
    String dir2 = targetDir + "/" + file[i].getName();
    copyDirectiory(dir1, dir2);
    }
    }
    }

    /**
    * 检查目录是否存在,如果不存在就创建目录
    *
    * @param dirPath
    */
    public static void createDirectory(String dirPath) {
    File file = new File(dirPath);
    if (!file.exists()) {
    file.mkdirs();
    }
    }

    /**
    * 删除文件或者目录
    *
    * @param file
    */
    public static void delete(File file) {
    if (file != null && file.exists()) {
    if (file.isDirectory()) {
    File files[] = file.listFiles();
    for (int i = 0, length = files.length; i < length; i++) {
    delete(files[i]);
    }
    } else {
    file.delete();
    }
    }
    }

    /**
    * 文件下载
    *
    * @param response
    * @param fileName
    * @param filePath
    * @throws IOException
    */
    public static void download(HttpServletResponse response, String fileName, String filePath) throws IOException {
    FileInputStream fis = null;
    BufferedInputStream buff = null;
    try {
    File file = new File(filePath);
    response.setContentType("application/x-msdownload");// 设置response的编码方式
    response.setContentLength((int) file.length());// 写明要下载的文件的大小
    response.setHeader("Content-Disposition",
    "attachment;filename=" + new String(fileName.getBytes(ToolString.encoding), "iso-8859-1")); // 解决中文乱码

    // 读出文件到i/o流
    fis = new FileInputStream(file);
    buff = new BufferedInputStream(fis);
    byte[] bytes = new byte[1024];// 相当于我们的缓存
    long k = 0;// 该值用于计算当前实际下载了多少字节
    OutputStream os = response.getOutputStream();// 从response对象中得到输出流,准备下载

    // 开始循环下载
    while (k < file.length()) {
    int j = buff.read(bytes, 0, 1024);
    k += j;
    os.write(bytes, 0, j);// 将b中的数据写到客户端的内存
    }

    os.flush();// 将写入到客户端的内存的数据,刷新到磁盘

    buff.close();
    buff = null;

    fis.close();
    fis = null;
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } finally {
    if (buff != null) {
    buff.close();
    buff = null;
    }
    if (fis != null) {
    fis.close();
    fis = null;
    }
    }
    }

    /**
    * 创建文件
    *
    * @param savePath
    * 保存路径
    * @param content
    * 文件内容
    */
    public static void createFile(String savePath, String content) {
    try {
    File file = new File(savePath);
    BufferedWriter output = new BufferedWriter(new FileWriter(file));
    output.write(content);
    output.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    /**
    * 指定位置开始写入文件
    * @param outPath 输出文件的路径(路径+文件名)
    * @param tempFile 输入文件
    * 描述 :把目标文件的指针,移到文件末尾,然后把分片文件追加进去,实现文件合并
    */
    public static void writeFile(String outPath, File tempFile) {
    RandomAccessFile raFile = null;
    BufferedInputStream inputStream=null;
    try{
    File dirFile = new File(outPath);
    raFile = new RandomAccessFile(dirFile, "rw"); //以读写的方式打开目标文件
    raFile.seek(raFile.length());
    inputStream = new BufferedInputStream(new FileInputStream(tempFile));
    byte[] buf = new byte[1024];
    int length = 0;
    while ((length = inputStream.read(buf)) != -1) {
    raFile.write(buf, 0, length);
    }
    }catch(Exception e){
    e.printStackTrace();
    }finally{
    try {
    if (inputStream != null) {
    inputStream.close();
    }
    if (raFile != null) {
    raFile.close();
    }
    }catch(Exception e){
    e.printStackTrace();
    }
    }
    }

    /***
    * 压缩GZip
    *
    * @param data
    * @return
    */
    public static byte[] gZip(byte[] data) {
    byte[] b = null;
    try {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    GZIPOutputStream gzip = new GZIPOutputStream(bos);
    gzip.write(data);
    gzip.finish();
    gzip.close();
    b = bos.toByteArray();
    bos.close();
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    return b;
    }

    /***
    * 解压GZip
    *
    * @param data
    * @return
    */
    public static byte[] unGZip(byte[] data) {
    byte[] b = null;
    try {
    ByteArrayInputStream bis = new ByteArrayInputStream(data);
    GZIPInputStream gzip = new GZIPInputStream(bis);
    byte[] buf = new byte[1024];
    int num = -1;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    while ((num = gzip.read(buf, 0, buf.length)) != -1) {
    baos.write(buf, 0, num);
    }
    b = baos.toByteArray();
    baos.flush();
    baos.close();
    gzip.close();
    bis.close();
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    return b;
    }

    /***
    * 压缩Zip
    *
    * @param data
    * @return
    */
    public static byte[] zip(byte[] data) {
    byte[] b = null;
    try {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ZipOutputStream zip = new ZipOutputStream(bos);
    ZipEntry entry = new ZipEntry("zip");
    entry.setSize(data.length);
    zip.putNextEntry(entry);
    zip.write(data);
    zip.closeEntry();
    zip.close();
    b = bos.toByteArray();
    bos.close();
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    return b;
    }

    /***
    * 解压Zip
    *
    * @param data
    * @return
    */
    public static byte[] unZip(byte[] data) {
    byte[] b = null;
    try {
    ByteArrayInputStream bis = new ByteArrayInputStream(data);
    ZipInputStream zip = new ZipInputStream(bis);
    while (zip.getNextEntry() != null) {
    byte[] buf = new byte[1024];
    int num = -1;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    while ((num = zip.read(buf, 0, buf.length)) != -1) {
    baos.write(buf, 0, num);
    }
    b = baos.toByteArray();
    baos.flush();
    baos.close();
    }
    zip.close();
    bis.close();
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    return b;
    }

    /***
    * 压缩BZip2
    *
    * @param data
    * @return
    */
    public static byte[] bZip2(byte[] data) {
    byte[] b = null;
    try {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    BZip2CompressorOutputStream bzip2 = new BZip2CompressorOutputStream(bos);
    bzip2.write(data);
    bzip2.flush();
    bzip2.close();
    b = bos.toByteArray();
    bos.close();
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    return b;
    }

    /***
    * 解压BZip2
    *
    * @param data
    * @return
    */
    public static byte[] unBZip2(byte[] data) {
    byte[] b = null;
    try {
    ByteArrayInputStream bis = new ByteArrayInputStream(data);
    BZip2CompressorInputStream bzip2 = new BZip2CompressorInputStream(bis);
    byte[] buf = new byte[1024];
    int num = -1;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    while ((num = bzip2.read(buf, 0, buf.length)) != -1) {
    baos.write(buf, 0, num);
    }
    b = baos.toByteArray();
    baos.flush();
    baos.close();
    bzip2.close();
    bis.close();
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    return b;
    }
    private static BASE64Decoder b= new BASE64Decoder();
    private static LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
    static {
    map.put("image/jpeg", ".jpg");
    map.put("image/gif", ".gif");
    map.put("image/png", ".png");
    map.put("video/mp4", ".mp4");
    map.put("video/quicktime", ".mov");
    map.put("audio/amr",".mp3");
    }
    public static String getSuffix(String fileType) {
    return map.get(fileType);
    }

    public static void writeFile(String filePath,InputStream is) {
    FileOutputStream fos=null;
    BufferedOutputStream bos=null;
    try{
    fos=new FileOutputStream(filePath);
    bos =new BufferedOutputStream(fos);

    int n = 0;// 每次读取的字节长度
    byte[] bb = new byte[1024];// 存储每次读取的内容
    while ((n = is.read(bb)) != -1) {
    bos.write(bb, 0, n);// 将读取的内容,写入到输出流当中
    }
    bos.flush();
    } catch (IOException e) {
    e.printStackTrace();
    }finally{
    try {
    if(bos!=null)bos.flush();
    if(fos!=null)fos.close();
    if(bos!=null)bos.close();
    if(is!=null)is.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    public static String getFilePath(String fileType) {
    String rootPath= PropKit.get("file.server.path");
    String path="";
    Calendar c=Calendar.getInstance();
    if(StrKit.notBlank(fileType)){
    path+=File.separator+fileType;
    }
    path+=File.separator+ DateKit.toStr(new Date(),"yyyy\MM");
    File file=new File(rootPath+path);
    if(file!=null && !file.exists()){
    file.mkdirs();
    }
    return path;
    }
    public static File createFile(String pathname) {
    try {
    File file = new File(pathname);
    if(!file.getParentFile().exists())
    file.getParentFile().mkdirs();
    file.createNewFile();
    return file;
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }

    public static File base64ToFile(String base64,String fileName){
    File file=null;
    FileOutputStream o=null;
    try {
    if(StrKit.notBlank(base64)){
    file=createFile(fileName);
    byte[] image = b.decodeBuffer(base64);
    o = new FileOutputStream(file);
    o.write(image);
    }
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }finally{
    try {
    if(o!=null)o.flush();
    if(o!=null)o.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    return file;
    }

    /**
    *
    * createFolder:(在指定文件夹下创建以月份命名的文件夹).
    * @author sjh
    * @param dir <br/>
    */
    public static String createDir(String dirNameParent){
    File dirParent=new File(dirNameParent);
    if (!dirParent.exists()) {
    System.out.println("目录" + dirNameParent + "不存在,正在尝试创建目录~");
    dirParent.mkdirs();
    }
    if (!dirNameParent.endsWith(File.separator) && !dirNameParent.endsWith("/")) {
    dirNameParent = dirNameParent + File.separator;
    }
    String dirName=DateFormatUtil.yyyyMMFormat.format(new Date());
    dirName = dirNameParent + dirName;
    File dir=new File(dirName);
    dirName+="/";
    if(dir.exists()){
    System.out.println("目录" + dirName + "已存在,无需创建~");
    return dirName;
    }else{
    if (dir.mkdirs()) {
    System.out.println("创建目录" + dirName + "成功!");
    return dirName;
    } else {
    System.out.println("创建目录" + dirName + "失败!");
    return null;
    }
    }
    }

    /**
    * 获得指定文件的byte数组
    */
    public static byte[] getBytes(File file){
    byte[] buffer = null;
    try {
    FileInputStream fis = new FileInputStream(file);
    ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
    byte[] b = new byte[1000];
    int n;
    while ((n = fis.read(b)) != -1) {
    bos.write(b, 0, n);
    }
    fis.close();
    bos.close();
    buffer = bos.toByteArray();
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    return buffer;
    }

    /**
    * 根据byte数组,生成文件
    */
    public static File getFile(byte[] bfile, String filePath,String fileName) {
    BufferedOutputStream bos = null;
    FileOutputStream fos = null;
    File file = null;
    try {
    File dir = new File(filePath);
    if(!dir.exists()&&dir.isDirectory()){//判断文件目录是否存在
    dir.mkdirs();
    }
    file = new File(filePath+"\"+fileName);
    fos = new FileOutputStream(file);
    bos = new BufferedOutputStream(fos);
    bos.write(bfile);
    return file;
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    if (bos != null) {
    try {
    bos.close();
    } catch (IOException e1) {
    e1.printStackTrace();
    }
    }
    if (fos != null) {
    try {
    fos.close();
    } catch (IOException e1) {
    e1.printStackTrace();
    }
    }
    }
    return file;
    }
    }


  • 相关阅读:
    python中写一个求阶乘的函数
    python中filter关键字
    python中写一个求阶乘的函数
    python中如何获取函数文档
    python中lambda关键字创建匿名函数
    固态硬盘中m.2、sata、nvme、ahci、pcie是什么?
    python中lambda关键字定义匿名函数
    python中实现实参可选
    python中map()内置函数
    python中将实参变成可选的
  • 原文地址:https://www.cnblogs.com/YuyuanNo1/p/10324228.html
Copyright © 2020-2023  润新知