永发信息网

用java修改jar包内容后读取jar包内容报异常

答案:1  悬赏:30  手机版
解决时间 2021-05-06 23:54
  • 提问者网友:骑士
  • 2021-05-06 07:16

问题跑一遍就知道,求高手解答!

 

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
import java.util.zip.ZipEntry;

public class Test {
 public static void main(String[] args) {
  String file = "com.ibm.icu_3.4.5.jar";
  String entryName = "about.html";
  System.err.println("修改前的" + entryName + ":");
  readJar(file, entryName);
  byte[] data = new byte[128];
  System.err.println("请输入新内容:");
  try {
   System.in.read(data);
  } catch (IOException e) {
   e.printStackTrace();
  }
  editJar(file, entryName, data);
  System.err.println("修改后的" + entryName + ":");
  readJar(file, entryName);

 }

 // 读取jar中某一文件
 public static void readJar(String file, String entryName) {
  try {
   JarFile jf = new JarFile(file);
   ZipEntry ze = jf.getEntry(entryName);
   InputStream is = jf.getInputStream(ze);
   InputStreamReader isr = new InputStreamReader(is);
   BufferedReader br = new BufferedReader(isr);
   while (null != br.readLine()) {
    System.out.println(br.readLine());
   }
   br.close();
   isr.close();
   is.close();
   jf.close();
  } catch (IOException e) {
   e.printStackTrace();
  }

 }

 // 修改jar中某一文件
 public static void editJar(String file, String entryName, byte[] data) {
  try {
   JarFile jf = new JarFile(file);
   TreeMap tm = new TreeMap();
   Enumeration es = jf.entries();
   while (es.hasMoreElements()) {
    JarEntry je = (JarEntry) es.nextElement();
    byte[] b = getByte(jf.getInputStream(je));
    tm.put(je.getName(), b);
   }
   JarOutputStream out = new JarOutputStream(
     new FileOutputStream(file));
   Set set = tm.entrySet();
   Iterator it = set.iterator();
   boolean has = false;
   while (it.hasNext()) {
    Map.Entry me = (Map.Entry) it.next();
    String name = (String) me.getKey();
    JarEntry jeNew = new JarEntry(name);
    out.putNextEntry(jeNew);
    byte[] b;
    if (name.equals(entryName)) {
     b = data;
     has = true;
    } else
     b = (byte[]) me.getValue();
    out.write(b, 0, b.length);
   }
   if (!has) {
    JarEntry jeNew = new JarEntry(entryName);
    out.putNextEntry(jeNew);
    out.write(data, 0, data.length);
   }
   out.finish();
   out.close();
   jf.close();

  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 // 从输入流中取字节
 public static byte[] getByte(java.io.InputStream s) {
  byte[] buffer = new byte[0];
  byte[] chunk = new byte[4096];
  int count;
  try {
   while ((count = s.read(chunk)) >= 0) {
    byte[] t = new byte[buffer.length + count];
    System.arraycopy(buffer, 0, t, 0, buffer.length);
    System.arraycopy(chunk, 0, t, buffer.length, count);
    buffer = t;
   }
   s.close();
  } catch (Exception e) {
  }
  return buffer;
 }

}

最佳答案
  • 五星知识达人网友:梦中风几里
  • 2021-05-06 08:00
Java新手上路大全(问问题之前请先看) Helloworld功略 http://www.matrix.org.cn/forum_view.ASP?forum_id=19&view_id=84 path和classpath 1.什么是java的path和classpath? http://www.matrix.org.cn/forum_view.ASP?forum_id=19&view_id=904 2.如何一次把一个目录下的所有.jar加入到classpath? http://www.matrix.org.cn/forum_view.ASP?forum_id=19&view_id=905 3.classspath 的默认值是什么? http://www.matrix.org.cn/forum_view.ASP?forum_id=19&view_id=906 4.怎样找到程序运行需要的类? http://www.matrix.org.cn/forum_view.ASP?forum_id=19&view_id=907 5. Linux下Path和ClassPath是怎么设的? http://www.matrix.org.cn/forum_view.ASP?forum_id=19&view_id=908 6.如何修改path和classpath? http://www.matrix.org.cn/forum_view.ASP?forum_id=19&view_id=909 java的帮助和api文档 1.什么是java的api参考? api是HTML格式的从sun的网站上可以找到一个包 包括api的参考和user guide,本站有做成.chm格式的便于查找。 api参考是用jdk的工具javadoc 生成的是开发者必备的文档。 2.哪里有JAVA基本类库的源代码? jdk的安装目录下有源码src.zip 3.java web start 是干什么用的? http://www.matrix.org.cn/forum_view.ASP?forum_id=19&view_id=911 开发环境 1.jre下的lib和jdk下的lib到底有什么区别? jre是JDK的一个子集。提供一个运行环境。JDK的lib目录是给JDK用的,例如JDK下有一些工具,可能要用该目录中的文件。例如,编译器等。JRE的lib目录是为JVM,运行时候用的。包括所有的标准类苦,和扩展类 2.我的jbuilder光标对不齐? http://www.matrix.org.cn/forum_view.ASP?forum_id=19&view_id=913 3.JDK版本冲突怎么办? 要决定windows使用哪一个JDK(win2000),改注册表: HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\CurrentVersion 的值,要决定JBuilder使用哪个JDK在project properties中可以设置。 4.editplus能够编译java嘛? 如何设置? 先要将JAVA的运行环境安装并且调试好。 首先,从菜单“工具(Tools)”->“配置用户工具...”进入用户工具设置。 在类别里展开“工具”树形菜单->“用户工具”,选择“组和工具项目”中的“Group 1”,点击面板右边的“组名称...”按钮,将文本“Group1”修改成“编译JAVA程序”。 然后选择修改的组“编译JAVA程序”,点击“添加新工具”按钮,选择程序,建立“新建程序”,选中它。 然后就是最重要的步骤(修改属性): 1.1 添加编译功能 “菜单文字”里的内容修改为“JAVAC”; “命令”选择安装JDK后的BIN目录中的编译程序JAVAC.EXE,如果JDK 安装路径为“c:\jdk”,那么此路径为“c:\jdk\bin\javac.exe”; “参数”选择“文件名称”,即显示为“$(FileName)”; “初始目录”选择“文件目录”,显示为“$(FileDir)”; 选择“捕获输出”复选框。 1.2 添加执行功能 “菜单文字”里的
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯