kkFileView代码分析(七)——FileUtils
发布日期:2022-03-08 21:50:39 浏览次数:4 分类:技术文章

本文共 7390 字,大约阅读时间需要 24 分钟。

2021SC@SDUSC

        项目中处理各类文件时都会声明一个FileUtils变量,FileUtils类提供了很多类处理文件时都需要进行的一些准备工作,这些基本操作会重复出现在很多,比如统计文件集合、获取路径、分析文件类型、统一编码格式等,为了避免出现过多重复代码而造成空间浪费,把这些代码都封装起来放在FileUtils类中实现,需要调用时直接声明对象即可。

        这样操作还有一个好处就是项目需要更新时,直接在FileUtils类中更改代码即可,方便且效率更高。FileUtils提供的功能可大致分为:

目录


1、统计集合:

        统计已经转换过的文件集合(缓存);

public Map
listConvertedFiles() { return cacheService.getPDFCache(); }

2、获取路径 

      在处理pdf文件转换成图片之前根据pdf的本地路径获取转换成图片后的本地相对路径;

/**     * @param key pdf本地路径     * @return 已将pdf转换成图片的图片本地相对路径     */    public Integer getConvertedPdfImage(String key) {        return cacheService.getPdfImageCache(key);    }

3、获取文件类型

        这个方法中为了保障数据安全性,防止参数中存在“.”符号或其他特殊字符,先抽取出文件名,再获取文件类型。文件类型包括图片(jpg、png等)、压缩包(zip、rar等)、office类型(ppt、word等)、simtext、多媒体(MP4等)、cad文件。

/**     * @param url url     * @return 文件类型     */public FileType typeFromUrl(String url) {        String nonPramStr = url.substring(0, url.contains("?") ? url.indexOf("?") : url.length());        String fileName = nonPramStr.substring(nonPramStr.lastIndexOf("/") + 1);        return typeFromFileName(fileName);         //先获取文件名字排除不良因素影响    }private FileType typeFromFileName(String fileName) {        String[] simText = ConfigConstants.getSimText();        String[] media = ConfigConstants.getMedia();// 获取所有系统可以处理的文件        String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);//filename中符合“.”最后出现的位置之后的字符串就是文件类型        if (listPictureTypes().contains(fileType.toLowerCase())) {            return FileType.picture;        }        if (listArchiveTypes().contains(fileType.toLowerCase())) {            return FileType.compress;        }        if (listOfficeTypes().contains(fileType.toLowerCase())) {            return FileType.office;        }        if (Arrays.asList(simText).contains(fileType.toLowerCase())) {            return FileType.simText;        }        if (Arrays.asList(media).contains(fileType.toLowerCase())) {            return FileType.media;        }        if ("pdf".equalsIgnoreCase(fileType)) {            return FileType.pdf;        }        if ("dwg".equalsIgnoreCase(fileType)) {            return FileType.cad;        }        return FileType.other;    }

值得一提的是,这里把pdf从office文件中单独拎出来。这是由于系统中很多文件最后都会以pdf的形式展示,所以这个方法会被多个类重复写,因此有必要单拎出来完成。 同样的还有添加转换成pdf后的文件缓存这个方法。

/**     * @param fileName pdf文件名     * @param value 缓存相对路径     */    public void addConvertedFile(String fileName, String value){        cacheService.putPDFCache(fileName, value);    }

        获取图片类型集合: 

public List
listPictureTypes(){ List
list = Lists.newArrayList(); list.add("jpg"); list.add("jpeg"); list.add("png"); list.add("gif"); list.add("bmp"); list.add("ico"); list.add("RAW"); return list; }

        获取压缩包类型文件的集合:

public List
listArchiveTypes(){ List
list = Lists.newArrayList(); list.add("rar"); list.add("zip"); list.add("jar"); list.add("7-zip"); list.add("tar"); list.add("gzip"); list.add("7z"); return list; }

         获取office文件集合:

public List
listOfficeTypes() { List
list = Lists.newArrayList(); list.add("docx"); list.add("doc"); list.add("xls"); list.add("xlsx"); list.add("ppt"); list.add("pptx"); return list; }

        获取文件的相对路径

从绝对路径中截取。fileDir的定义如下:

FILE_DIR = OfficeUtils.getHomePath() + File.separator + "file" + File.separator;
/**     * @param absolutePath 绝对路径     * @return 相对路径     */    public String getRelativePath(String absolutePath) {        return absolutePath.substring(fileDir.length());    }

4、对编码格式进行操作

        通过绝对路径判断文件编码格式

/* @param path 绝对路径     * @return 编码格式     */    public String getFileEncodeUTFGBK(String path){        String enc = Charset.forName("GBK").name();        File file = new File(path);        InputStream in;        try {            in = new FileInputStream(file);            byte[] b = new byte[3];            in.read(b);            in.close();            if (b[0] == -17 && b[1] == -69 && b[2] == -65) {                enc = StandardCharsets.UTF_8.name();            }        } catch (IOException e) {            e.printStackTrace();        }        System.out.println("文件编码格式为:" + enc);        return enc;    }

对转换过后的文件改变编码方式 

/**     * 对转换后的文件进行操作(改变编码方式)     * @param outFilePath 文件绝对路径     */    public void doActionConvertedFile(String outFilePath) {        StringBuilder sb = new StringBuilder();        try (InputStream inputStream = new FileInputStream(outFilePath);            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, DEFAULT_CONVERTER_CHARSET))){            String line;            while(null != (line = reader.readLine())){                if (line.contains("charset=gb2312")) {                    line = line.replace("charset=gb2312", "charset=utf-8");                }                sb.append(line);            }            // 添加sheet控制头            sb.append("");            sb.append("");            sb.append("
"); } catch (IOException e) { e.printStackTrace(); } // 重新写入文件 try(FileOutputStream fos = new FileOutputStream(outFilePath); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos, StandardCharsets.UTF_8))) { writer.write(sb.toString()); } catch (IOException e) { e.printStackTrace(); } }

获取url中的参数 

/**     * 获取url中的参数     * @param url url     * @param name 参数名     * @return 参数值     */    public String getUrlParameterReg(String url, String name) {        Map
mapRequest = new HashMap<>(); String strUrlParam = truncateUrlPage(url); if (strUrlParam == null) { return ""; } //每个键值为一组 String[] arrSplit = strUrlParam.split("[&]"); for(String strSplit : arrSplit) { String[] arrSplitEqual = strSplit.split("[=]"); //解析出键值 if(arrSplitEqual.length > 1) { //正确解析 mapRequest.put(arrSplitEqual[0], arrSplitEqual[1]); } else if (!arrSplitEqual[0].equals("")) { //只有参数没有值,不加入 mapRequest.put(arrSplitEqual[0], ""); } } return mapRequest.get(name); }

分割url中的参数部分 

/**     * 去掉url中的路径,留下请求参数部分     * @param strURL url地址     * @return url请求参数部分     */    private String truncateUrlPage(String strURL) {        String strAllParam = null;        strURL = strURL.trim();        String[] arrSplit = strURL.split("[?]");        if(strURL.length() > 1)  {            if(arrSplit.length > 1) {                if(arrSplit[1] != null) {                    strAllParam=arrSplit[1];                }            }        }        return strAllParam;    }

获取文件属性 

/**     * 获取文件属性     * @param url url     * @return 文件属性     */    public FileAttribute getFileAttribute(String url) {        String fileName;        FileType type;        String suffix;        String fullFileName = getUrlParameterReg(url, "fullfilename");        if (!StringUtils.isEmpty(fullFileName)) {            fileName = fullFileName;            type = typeFromFileName(fileName);            suffix = suffixFromFileName(fileName);        } else {            fileName = getFileNameFromURL(url);            type = typeFromUrl(url);            suffix = suffixFromUrl(url);        }        return new FileAttribute(type,suffix,fileName,url);    }}

转载地址:https://blog.csdn.net/m0_55503427/article/details/121781784 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:kkFileView代码分析(十)——过滤器分析
下一篇:kkFiewView代码分析(九)——office插件相关

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年03月29日 02时14分41秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章