博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS 文件解析
阅读量:6240 次
发布时间:2019-06-22

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

1 import java.io.BufferedInputStream;  2 import java.io.File;  3 import java.io.FileInputStream;  4 import java.io.IOException;  5 import java.io.InputStream;  6 import java.io.StringReader;  7 import java.util.ArrayList;  8 import java.util.HashMap;  9 import java.util.List; 10 import java.util.zip.ZipEntry; 11 import java.util.zip.ZipFile; 12 import java.util.zip.ZipInputStream; 13  14 import org.apache.commons.lang.StringUtils; 15 import org.apache.poi.util.IOUtils; 16 import org.dom4j.Document; 17 import org.dom4j.DocumentException; 18 import org.dom4j.Element; 19 import org.dom4j.io.SAXReader; 20 import org.w3c.dom.Node; 21 import org.xml.sax.InputSource; 22  23  24 /** 25  * IOS文件解析 26  *  27  * @author     dKF63325 28  * @version    ONIP BME V300R001 2014-6-9 29  * @since      ONIP BME V300R001C00 30  */ 31 public class IosInfoUtils 32 { 33  34      35     public static HashMap
getIosInfo(String filePath, String fileName) throws Exception 36 { 37 // 获得二级目录名称 38 String appName = getAppName(filePath); 39 40 // 解析文件 41 HashMap
infoMap = parseXml(filePath, appName); 42 43 File file = new File(filePath); 44 // 文件名称 45 infoMap.put("fileName", file.getName()); 46 // 文件大小 47 infoMap.put("fileSize", convertFileSize(file.length())); 48 // 文件大小(单位:字节) 49 infoMap.put("fileByteSize", file.length()); 50 // 是否存在SDK 51 infoMap.put("isSDK", AXMLPrinter2.isExistsSdkFromIOS(filePath, appName)); 52 // SDK版本号 53 infoMap.put("sdkVersion", AXMLPrinter2.getSdkVersionFromIOS(filePath, appName)); 54 55 return infoMap; 56 } 57 58 private static String getAppName(String filePath) 59 { 60 ZipFile file = null; 61 InputStream in = null; 62 String name = StringUtils.EMPTY; 63 try 64 { 65 in = new BufferedInputStream(new FileInputStream(filePath)); 66 ZipInputStream zip = new ZipInputStream(in); 67 ZipEntry zp = null; 68 while ((zp = zip.getNextEntry()) != null) 69 { 70 name = zp.getName(); 71 if (name.indexOf(".app") != -1) 72 { 73 name = name.substring(name.indexOf("Payload/")+"Payload/".length(), name.indexOf(".app") + ".app".length()); 74 break; 75 } 76 } 77 } 78 catch (IOException e) 79 { 80 DEBUGGER.error("Failed to getAppName", e); 81 } 82 finally 83 { 84 IOUtils.closeQuietly(in); 85 AXMLPrinter2.closeZipFile(file); 86 } 87 return name; 88 } 89 90 private static HashMap
parseXml(String filePath, String projectName) throws IOException, Exception, DocumentException 91 { 92 String xml = AXMLPrinter2.getXmlFromIOS(filePath, projectName); 93 StringReader read = new StringReader(xml); 94 InputSource scource = new InputSource(read); 95 SAXReader sax = new SAXReader(); 96 sax.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 97 Document root = sax.read(scource); 98 Element dictElement = (Element) root.selectSingleNode("//dict"); 99 List
children = filterElement(dictElement.elements());100 HashMap
infoMap = new HashMap
();101 for (int i = 0; i < children.size(); i+=2)102 {103 Element key = children.get(i);104 Element val = children.get(i+1);105 if ("array".equals(val.getName()))106 {107 List
arrayList = filterElement(val.elements());108 String values = StringUtils.EMPTY;109 for (Element element : arrayList)110 {111 values += element.getStringValue() + ",";112 }113 infoMap.put(key.getStringValue(), StringUtils.removeEnd(values, ","));114 } else if ("true".equals(val.getName())) {115 infoMap.put(key.getStringValue(), true);116 } else if ("false".equals(val.getName())) {117 infoMap.put(key.getStringValue(), false);118 } else {119 infoMap.put(key.getStringValue(), val.getStringValue());120 }121 }122 return infoMap;123 }124 125 private static List
filterElement(List
elements) {126 List
result = new ArrayList
(elements.size());127 for (Object object : elements)128 {129 Element element = (Element)object;130 if (element.getNodeType() == Node.ELEMENT_NODE)131 {132 result.add(element);133 }134 }135 return result;136 }137 138 public static String convertFileSize(long filesize)139 {140 String strUnit = "Bytes";141 String strAfterComma = "";142 int intDivisor = 1;143 if (filesize >= 1024 * 1024)144 {145 strUnit = "MB";146 intDivisor = 1024 * 1024;147 } else if (filesize >= 1024)148 {149 strUnit = "KB";150 intDivisor = 1024;151 }152 if (intDivisor == 1){153 return filesize + " " + strUnit;154 }155 156 strAfterComma = "" + 100 * (filesize % intDivisor) / intDivisor;157 if (strAfterComma.equals(""))158 strAfterComma = ".0";159 160 return filesize / intDivisor + "." + strAfterComma + " " + strUnit;161 }162 }

 

转载于:https://www.cnblogs.com/XQiu/p/5282658.html

你可能感兴趣的文章
前端技术周刊 2018-08-13:Web Components
查看>>
kube-proxy源码解析
查看>>
REM,你这磨人的小妖精!
查看>>
聊聊HystrixConcurrencyStrategy
查看>>
PHP多进程系列笔记(一)
查看>>
深析Vue双向数据绑定(MVVM模型)
查看>>
【跃迁之路】【485天】程序员高效学习方法论探索系列(实验阶段242-2018.06.05)...
查看>>
react如果你想为一个组件返回多个元素怎么办?
查看>>
mybatis 为什么每次插入的时候总会创建一个SqlSession?
查看>>
Vue 教程第十六篇—— Vuex 之 action
查看>>
javaScript旋转Base64图片并得到新的base64数据
查看>>
使用opennlp自定义命名实体
查看>>
浅析k8s service的应用
查看>>
Node.js性能分析神器Easy-Monitor
查看>>
css基础—字体那些事
查看>>
性能优化之MySQL调优篇
查看>>
Angular开发实践(七): 跨平台操作DOM及渲染器Renderer2
查看>>
Laravel 教程 - 实战 iBrand 开源电商 API 系统
查看>>
vue-cli的坑,loader重复的锅 Invalid CSS after "...load the styles"
查看>>
手写Spring之IOC基于xml动态创建对象
查看>>