目录

1.最终效果图

2.项目整体图

3.源代码

3.1创建jar包主入口Main

3.2创建IpaUI

3.3创建IpaService

3.4创建IpaDao

4.打jar包

5.项目下载链接


需求简介:解压ipa文件到当前目录,读取ipa文件下的info.plist,并返回到java UI界面。

1.最终效果图

2.项目整体图

jar包可以去maven仓库下载 http://mvnrepository.com/artifact/com.googlecode.plist/dd-plist

3.源代码

3.1创建jar包主入口Main

public class Main {public static void main(String[] args) throws Exception {new IpaUI();}
}

3.2创建IpaUI

主要涉及java.swing的使用

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;public class IpaUI {public static JFrame frmIpa;public JTextArea textArea;public IpaUI() {// 窗口框架frmIpa = new JFrame();frmIpa.setTitle("ipa工具类");frmIpa.setBounds(600, 300, 500, 400);frmIpa.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 面板1JPanel panel = new JPanel();frmIpa.getContentPane().add(panel, BorderLayout.NORTH);JButton button = new JButton("选择文件");// 监听button的选择路径button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {JFileChooser jfc = new JFileChooser();
//                       jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );// 显示打开的文件对话框jfc.showSaveDialog(frmIpa);try {// 使用文件类获取选择器选择的文件File file = jfc.getSelectedFile();//String content = IpaService.getIpaInfoMap(file.toString());textArea.setText(content);} catch (Exception e2) {JPanel panel3 = new JPanel();JOptionPane.showMessageDialog(panel3, "没有选中任何文件", "提示", JOptionPane.WARNING_MESSAGE);}}});panel.add(button);// 可滚动面板JScrollPane scrollPane = new JScrollPane();frmIpa.getContentPane().add(scrollPane, BorderLayout.CENTER);textArea = new JTextArea();
//      textArea.setFont(new Font("黑体",Font.BOLD,15));scrollPane.setViewportView(textArea);// 面板2
//              JPanel panel2 = new JPanel();
//              frmIpa.getContentPane().add(panel2, BorderLayout.SOUTH);
//              JButton button2 = new JButton("请选择解压路径");
//              button2.addActionListener(new ActionListener() {
//                      public void actionPerformed(ActionEvent e) {
//                          JFileChooser jfc=new JFileChooser();jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );
//                          //显示打开的文件对话框
//                           jfc.showSaveDialog(frmIpa);
//                          try {
//                              //使用文件类获取选择器选择的文件
//                              File file = jfc.getSelectedFile();
//                              String content = ReadUtils.getIpaInfoMap(file.toString());
//                              textArea.setText(content);
//                          } catch (Exception e2) {
//                              System.out.println("没有选中任何输出路径");
//                          }
//                  }
//              });
//              panel2.add(button2);//全部显示frmIpa.setVisible(true);}}

3.3创建IpaService

主要涉及dd.plist的使用,解析ipa/*/info.plist文件。


import java.io.File;
import java.util.Map.Entry;import javax.swing.JOptionPane;
import javax.swing.JPanel;
import com.dd.plist.NSArray;
import com.dd.plist.NSDictionary;
import com.dd.plist.NSObject;
import com.dd.plist.PropertyListParser;/*** 1.键值对对象,直接添加* 2.字典对象,添加键,值递归*      2.1值数组 *        2.2值字典*             * 3.数组对象,添加键,值判断*/
public class IpaService {/*** 1.生成info.plist文件的键值对* * @param ipa 输入api文件的路径* @return map Info.plist文件中的信息转为键值对 .api文件---->.zip文件---->返回Info.plist*/public static String getIpaInfoMap(String ipaPath) {try {File Infofile = IpaDao.unZip(ipaPath);// 解析路径中的文件,封装到map集合NSDictionary parse = (NSDictionary) PropertyListParser.parse(Infofile);String infoPlist = digui(parse, -1);return infoPlist;} catch (Exception e) {JPanel panel = new JPanel();JOptionPane.showMessageDialog(panel, "文件类型不支持", "提示", JOptionPane.WARNING_MESSAGE);}return null;}/*** 2.递归方法* * @param sb* @return*/public static String digui(NSDictionary parse, int count) {++count;StringBuffer sb = new StringBuffer();for (Entry<String, NSObject> entry : parse.entrySet()) {// 获取文档键对应的值String object = entry.getValue().toString();// 获取文档键String key = entry.getKey();// 1.判断是否是其他类型if (object.contains("NSArray") || object.contains("NSDictionary")) {// 1.1数组类型判断if (object.contains("NSArray")) {NSObject[] array = ((NSArray) parse.get(key)).getArray();// 1.1.1先添加主键for (int i = 0; i < count; i++) {sb.append("\t");}sb.append(key + ":" + "\r\n");// 1.1.2判断值类型for (int i = 0; i < array.length; i++) {//如果是字典类型,继续递归if (array[i].toString().contains("NSDictionary")) {NSDictionary parse3 = (NSDictionary) array[i];String digui2 = digui(parse3, count);sb.append(digui2);} //如果是数值,直接添加else {for (int j = 0; j < count; j++) {sb.append("\t");}sb.append("\t" + array[i] + "\r\n");}}}//1.2字典类型判断else {for (int i = 0; i < count; i++) {sb.append("\t");}sb.append(key + ":" + "\r\n");NSDictionary parse2 = (NSDictionary) parse.get(key);String digui3 = digui(parse2, count);sb.append(digui3);}}// 2.如果是键值对类型直接添加else {for (int i = 0; i < count; i++) {sb.append("\t");}sb.append(key + ":" + parse.get(key) + "\r\n");}}return sb.toString();}}

3.4创建IpaDao

主要涉及对javazip的使用,IO流解压zip文件。


import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
/*** 解压Zip文件工具类*/
public class IpaDao {private static final int buffer = 2048;/*** 解压Zip文件* @param ipaPath 文件目录* @throws IOException */public static File unZip(String ipaPath) throws IOException {int count = -1;File file = null;InputStream is = null;FileOutputStream fos = null;BufferedOutputStream bos = null;ZipFile zipFile = null;File result = null;String savepath = "";savepath = ipaPath.substring(0, ipaPath.lastIndexOf(".")) + File.separator;File existsSavePath = new File(savepath); // 创建保存目录if(existsSavePath.exists()){existsSavePath.delete();}existsSavePath.mkdir();zipFile = new ZipFile(ipaPath); // 解决中文乱码问题Enumeration<?> entries = zipFile.entries();while (entries.hasMoreElements()) {byte buf[] = new byte[buffer];ZipEntry entry = (ZipEntry) entries.nextElement();String filename = entry.getName();boolean ismkdir = false;// 检查此文件是否带有文件夹if (filename.lastIndexOf("/") != -1) { ismkdir = true;}filename = savepath + filename;// 如果是文件夹先创建if (entry.isDirectory()) {file = new File(filename);file.mkdirs();continue;}file = new File(filename);// 如果是文件夹先创建if (!file.exists()) { if (ismkdir) {new File(filename.substring(0, filename.lastIndexOf("/"))).mkdirs(); // 目录先创建}}file.createNewFile(); // 创建文件//判断文件名字if(filename.endsWith(".app/Info.plist")) {result = new File(filename);}is = zipFile.getInputStream(entry);fos = new FileOutputStream(file);bos = new BufferedOutputStream(fos, buffer);while ((count = is.read(buf)) > -1) {bos.write(buf, 0, count);}bos.flush();bos.close();fos.close();is.close();}zipFile.close();try {if (bos != null) {bos.close();}if (fos != null) {fos.close();}if (is != null) {is.close();}if (zipFile != null) {zipFile.close();}} catch (Exception e) {e.printStackTrace();}return result;}
}

4.打jar包

利用我们的工具eclipse,

1.右键工程 -> Export...  -> Java文件夹 -> Runnable JAR file -> Next

出现如下界面

2.> 在Launch configuration: 下选择你要导出的工程

如果没有项目选项,先把项目main方法运行一遍,再回到这里就能看到了

3.> Extract required libraries into generated JAR

4.> 接下来直接点 Finish,中间出现的所有弹窗,全选是。

eclipse打jar包详解

https://blog.csdn.net/qq_42035966/article/details/82086454

5.项目下载链接附源码

https://download.csdn.net/download/qq_42035966/10761555

至此,一个星期的学习及实战完毕,思路和学习方法真的重要,在路上浪费了不少思路错误的时间,导致进度缓慢。加油。

Java读取.ipa程序下info.plist相关推荐

  1. java读取文件夹下所有文件并替换文件每一行中指定的字符串

    java读取文件夹下所有文件并替换文件每一行中指定的字符串 该文章为转载文章,请尊重原文作者的劳动成果,好的文章应该被展示 原文传送门 多说两句,关键时候救人性命的人,可以称之为大人,随时做好利见大人 ...

  2. Java读取文件夹下的所有文件名和文件内容

    读取文件夹下的所有文件名和文件内容 1. 读取指定目录下的每一个文件的文件名和文件内容 2. 并把文件名作为key,文件内容为value 存储在map集合中 3. 通过遍历map集合拿到我们需要的文件 ...

  3. java 读取文件夹下的所有文件和文件夹名

    java 读取文件夹下的所有文件和文件夹名 用File import java.io.File; import java.util.HashMap; import java.util.Map; imp ...

  4. Java 读取指定目录下的文件名和目录名

    需求:读取指定目录下的文件名和目录名 实现如下: package com.test.common.util;import java.io.File;public class ReadFile {/** ...

  5. java读取resouces目录下文件

    resources中存放一些个资源文件,比如properties文件等,编译好会自动将这里边的文件复制到target/classes里去.获取资源文件的方法说明: XXX.class.getResou ...

  6. Java读取文件夹下的指定类型的文件(包含子文件夹)

    java如何获取文件下某种类型的文件呢,本文通过递归筛选实现此功能,代码如下: import java.io.File; import java.util.ArrayList; import java ...

  7. java读取文件夹下的所有txt文件,java读取文件夹下文件及txt内容

    public class PositionController { // 读取txt内容 public static String txt2String(File file) { StringBuil ...

  8. java读取src路径下的txt文件_Java程序使用Maven后无法运行?

    问:老师,同样的代码,为何我将Java工程改造成Maven后,始终无法运行? 实现的功能:加载abc.txt文件,代码是写在了Demo类中. 开发工具是Idea. 1.以下是普通Java工程的目录结构 ...

  9. Java读取指定路径下的文件列表

    直接贴代码吧.不过这里要做一个简单的说明,对于这个程序,我们必须保证我们在F盘下有一个log_files的文件夹,因为在后面写入文件的时候,如果路径中的文件不存在,是程序可以自动为其添加,但如果没有了 ...

最新文章

  1. 用createrepo配置Yum本地源
  2. HSI颜色空间及其应用
  3. haproxy负载均衡
  4. Coursera课程Python for everyone:chapter7
  5. 百度地图的两套JavaScript API
  6. vue项目,webpack中配置src路径别名及使用
  7. 基本数据类型的成员变量放在jvm的哪块内存区域里?
  8. 4. linux调用文件计算阶乘前5项和_嵌入式Linux系统编程——文件读写访问、属性、描述符、API
  9. 【python】循环结构if、for 、while
  10. android右滑返回动画,Android仿微信右滑返回功能的实例代码
  11. python 连接pg数据库
  12. 如何做系列(5)-james mail安装总结
  13. Scala的安装与配置
  14. Magic Gems魔法石
  15. SAR ADC系列16:CDAC上机实践+作业
  16. 财务管理-货币的时间价值C++程序
  17. 算法成长之路------CF22A Second Order Statistics
  18. 从底层到算法 — 2020年最全的大厂面试题
  19. 考西电计算机科学研究生科目,西安电子科技大学833计算机专业基础综合2021年硕士研究生招生考试自命题科目考试大纲...
  20. 空瓶换酒问题【一行代码】

热门文章

  1. 微机原理学习笔记——寻址方式和传送指令(MOV)
  2. 强联通分量,双联通分量详解
  3. 【专访邹欣】投身软件工程教育的程序员
  4. Python PyWin32 模块
  5. myeclipse2017下载安装 破解以及汉化
  6. 教你怎样选择儿童房地毯
  7. 基于深批标准化的eLU AlexNet模型作物病害分类(plantvillage+改进3*3+AlexNet)
  8. WIN7中使用c#控制微软拼音输入法
  9. Map集合中获取key-value值的方法
  10. 《数据分析变革:大数据时代精准决策之道》一2.3 纵观全局看待大数据