IOS 文件解析

  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<String, Object> getIosInfo(String filePath, String fileName) throws Exception
 36     {
 37         // 获得二级目录名称
 38         String appName = getAppName(filePath);
 39         
 40         // 解析文件
 41         HashMap<String, Object> 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<String, Object> 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<Element> children = filterElement(dictElement.elements());
100         HashMap<String, Object> infoMap = new HashMap<String, Object>();
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<Element> 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<Element> filterElement(List<?> elements) {
126         List<Element> result = new ArrayList<Element>(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值