- 浏览: 362564 次
- 性别:
- 来自: 广东珠海
文章分类
最新评论
-
cuiyijing:
[size=small]马士兵 26_homework_dml ...
SQL面试题 -
utobe:
兄弟 你真的出名了,尚学堂 oracle 马士兵的视频拿你的题 ...
SQL面试题 -
tlqtangok:
没看懂,能解释一下吗?
安装Oracle后java的jvm会报错 -
a114d:
itling 写道尚学堂的demo楼上威武
hibernate 全面学习【hibernate抓取策略 】 -
wohenshuaiba:
不错,但是没写return checkimg( this ); ...
图片上传
我们知道,用ZIP,jar可以将多个文件一起打包,如classes,images etc. 其实我们可以用J2SE的SDK提供的Jar命令来创建Jar文件,尽管我们可以通过该命令添加一个文件到Jar包中,但我们没有很直接的办法在程序中这么做,也没有办法通过Jar命令在Jar中删除一个或多个文件,
下面我们来研究一下如何更新一个Jar:要更新一个Jar,你必须创建原Jar文件的一个拷贝,在我们更新完拷贝后移除原文件,然后将拷贝重命名为原文件名就可以了。(译者注:我曾经试图找过更直接的办法,但是徒劳。只是找到这篇文章的原文) 对于添加一个或多个文件,删除一个或多个文件,思路应该是一样的。我们将举例更新一个Jar文件。
首先我们应该知道如何列出Jar文件中的Entries:
JarFile jar = new JarFile(name); Enumeration e = jar.entries(); while (e.hasMoreElements()) { System.out.println("\t" + entry.getName()); }
然后我们要知道如何写入Jar文件
while (entries.hasMoreElements()) { JarEntry entry = (JarEntry) entries.nextElement(); InputStream is = jar.getInputStream(entry); newJar.putNextEntry(entry); while ((bytesRead = is.read(buffer)) != -1) { newJar.write(buffer, 0, bytesRead); } }
这里的输出是一个JarOutputStream
File tempJar = File.createTempFile(nameOfJar, null); JarOutputStream newJar = new JarOutputStream( new FileOutputStream(tempJar));
在确定更新成功时,我们不要忘记删除原文件,并重新命名临时文件。
if (success) { File origFile = new File(nameOfJar); origFile.delete(); tempJar.renameTo(origFile); }
下边我们将给出完整的代码:
import java.io.*; import java.util.*; import java.util.zip.*; import java.util.jar.*; public class AddFileToJar { public static void main(String args[]) { if (args.length != 2) { System.err.println( "command: java AddFileToJar example.jar filetoadd.txt"); System.exit(-1); } String nameOfJar = args[0]; String nameToAdd = args[1]; File tempJar = null; try { tempJar = File.createTempFile(nameOfJar, null); } catch (IOException e) { System.err.println("Unable to create intermediate file."); System.exit(-2); } JarFile jar = null; try { jar = new JarFile(nameOfJar); } catch (IOException e) { System.err.println("Unable to access original file."); System.exit(-3); } // Only rename file at end on success boolean success = false; try { JarOutputStream newJar = new JarOutputStream( new FileOutputStream(tempJar)); byte buffer[] = new byte[1024]; int bytesRead; try { FileInputStream fis = new FileInputStream(nameToAdd); // Add back the original files Enumeration entries = jar.entries(); while (entries.hasMoreElements()) { // Prompt for copy JarEntry entry = (JarEntry) entries.nextElement(); String name = entry.getName(); System.out.println ("Copy " + name + " into new jar? (y or n)"); BufferedReader reader = new BufferedReader (new InputStreamReader(System.in)); String line = reader.readLine(); if ("n".equals(line)) { // if user enters n, don't copy file, // move to next name System.out.println("Skipping: " + name); continue; } InputStream is = jar.getInputStream(entry); newJar.putNextEntry(entry); while ((bytesRead = is.read(buffer)) != -1) { newJar.write(buffer, 0, bytesRead); } } // Add new file last try { JarEntry entry = new JarEntry(nameToAdd); newJar.putNextEntry(entry); while ((bytesRead = fis.read(buffer)) != -1) { newJar.write(buffer, 0, bytesRead); } } finally { fis.close(); } success = true; } catch (IOException ex) { System.err.println ("Operation aborted due to : " + ex); } finally { try { newJar.close(); } catch (IOException ignored) { } } } catch (IOException ex) { System.err.println( "Can't access new file"); } finally { try { jar.close(); } catch (IOException ignored) { } if (!success) { tempJar.delete(); } } if (success) { File origFile = new File(nameOfJar); origFile.delete(); tempJar.renameTo(origFile); } } }
下面我们来研究一下如何更新一个Jar:要更新一个Jar,你必须创建原Jar文件的一个拷贝,在我们更新完拷贝后移除原文件,然后将拷贝重命名为原文件名就可以了。(译者注:我曾经试图找过更直接的办法,但是徒劳。只是找到这篇文章的原文) 对于添加一个或多个文件,删除一个或多个文件,思路应该是一样的。我们将举例更新一个Jar文件。
首先我们应该知道如何列出Jar文件中的Entries:
JarFile jar = new JarFile(name); Enumeration e = jar.entries(); while (e.hasMoreElements()) { System.out.println("\t" + entry.getName()); }
然后我们要知道如何写入Jar文件
while (entries.hasMoreElements()) { JarEntry entry = (JarEntry) entries.nextElement(); InputStream is = jar.getInputStream(entry); newJar.putNextEntry(entry); while ((bytesRead = is.read(buffer)) != -1) { newJar.write(buffer, 0, bytesRead); } }
这里的输出是一个JarOutputStream
File tempJar = File.createTempFile(nameOfJar, null); JarOutputStream newJar = new JarOutputStream( new FileOutputStream(tempJar));
在确定更新成功时,我们不要忘记删除原文件,并重新命名临时文件。
if (success) { File origFile = new File(nameOfJar); origFile.delete(); tempJar.renameTo(origFile); }
下边我们将给出完整的代码:
import java.io.*; import java.util.*; import java.util.zip.*; import java.util.jar.*; public class AddFileToJar { public static void main(String args[]) { if (args.length != 2) { System.err.println( "command: java AddFileToJar example.jar filetoadd.txt"); System.exit(-1); } String nameOfJar = args[0]; String nameToAdd = args[1]; File tempJar = null; try { tempJar = File.createTempFile(nameOfJar, null); } catch (IOException e) { System.err.println("Unable to create intermediate file."); System.exit(-2); } JarFile jar = null; try { jar = new JarFile(nameOfJar); } catch (IOException e) { System.err.println("Unable to access original file."); System.exit(-3); } // Only rename file at end on success boolean success = false; try { JarOutputStream newJar = new JarOutputStream( new FileOutputStream(tempJar)); byte buffer[] = new byte[1024]; int bytesRead; try { FileInputStream fis = new FileInputStream(nameToAdd); // Add back the original files Enumeration entries = jar.entries(); while (entries.hasMoreElements()) { // Prompt for copy JarEntry entry = (JarEntry) entries.nextElement(); String name = entry.getName(); System.out.println ("Copy " + name + " into new jar? (y or n)"); BufferedReader reader = new BufferedReader (new InputStreamReader(System.in)); String line = reader.readLine(); if ("n".equals(line)) { // if user enters n, don't copy file, // move to next name System.out.println("Skipping: " + name); continue; } InputStream is = jar.getInputStream(entry); newJar.putNextEntry(entry); while ((bytesRead = is.read(buffer)) != -1) { newJar.write(buffer, 0, bytesRead); } } // Add new file last try { JarEntry entry = new JarEntry(nameToAdd); newJar.putNextEntry(entry); while ((bytesRead = fis.read(buffer)) != -1) { newJar.write(buffer, 0, bytesRead); } } finally { fis.close(); } success = true; } catch (IOException ex) { System.err.println ("Operation aborted due to : " + ex); } finally { try { newJar.close(); } catch (IOException ignored) { } } } catch (IOException ex) { System.err.println( "Can't access new file"); } finally { try { jar.close(); } catch (IOException ignored) { } if (!success) { tempJar.delete(); } } if (success) { File origFile = new File(nameOfJar); origFile.delete(); tempJar.renameTo(origFile); } } }
发表评论
-
aspect jar包
2013-06-17 14:35 1032aspectj需要的jar包 -
mockejb
2012-04-28 14:37 0<?xml version="1.0" ... -
ohfp
2012-04-20 17:58 0Hi All, Thanks a lot for your ... -
conditional import
2012-04-20 13:19 0Introduction In RBP, single c ... -
datasource
2012-04-12 15:38 0import java.util.ArrayList; imp ... -
java
2012-03-23 12:59 0package com.hsbc.esf.cache.impl ... -
java
2012-03-23 12:57 0package com.hsbc.esf.cache.impl ... -
java
2012-03-23 11:52 0package com.hsbc.esf.cache; im ... -
java
2012-03-07 11:40 0XmlTestUtil public final class ... -
trace
2012-03-07 11:28 0AbstractFormatter import java ... -
求能够在pdf最后一页加上统计所有本页合计的数量
2008-12-07 14:21 2496请教各们同仁.怎么能够控制到itext 生成最后一页的时候.加 ... -
EAM系统(MAXIMO)石油天然气行业解决方案
2008-07-24 13:50 2689EAM系统(MAXIMO)石油天 ... -
深入浅出java Io
2007-04-01 13:57 2205一.Input和Output 1.stream代 ... -
java中timer用法
2007-04-01 13:15 8683所有类型的 Java 应用程序一般都需要计划重复执行的任务。企 ... -
csdn上的反射和代理的好例子
2007-03-07 11:25 2232/** *这个程序的功能是通过反射技术得到一个类(SrcC ... -
一个java反射例子
2007-03-01 11:04 14493package com.spring.event; impor ... -
贴几个自定义usertype
2007-02-24 08:38 1555import java.io.IOException; ... -
修改Structs,Hibernate部份框架为我所用
2007-02-24 08:30 93package com.ideal.common.contro ... -
java基础试题
2007-02-21 09:06 8003一.选择题(每道题3分,共45分) 1 2 3 4 5 6 7 ... -
java学习资料推存
2007-02-20 16:14 1758JAVA 学习资料(吐血推荐) A.书名:《Thinking ...
相关推荐
为了使JAR文件成为可执行文件,开发者需要在`MANIFEST.MF`中添加`Main-Class`字段,指定程序的入口点(即包含`public static void main(String[] args)`方法的类)。例如,如果主类位于`test`包下,名为`Test`,`...
这种方法虽然不能直接运行JAR文件中的程序,但对于查看其内部结构非常有帮助。 #### 二、JAR文件与Java环境的关联 为了使JAR文件能够像其他可执行文件一样直接通过双击打开,我们需要对系统进行一些设置,使其自动...
Java 打包成 jar 文件和将 jar 文件导出为 exe 文件的方法汇总 本文档将详细介绍 Java 打包成 jar 文件和将 jar 文件导出为 exe 文件的方法汇总。Java 是一种流行的编程语言,广泛应用于软件开发、Android 应用开发...
本篇文章将详细讲解如何在APK文件中添加JAR文件,以及涉及到的相关工具——baksmali、apktool和jar2dex。 首先,我们来理解一下JAR文件。Java Archive(JAR)文件是Java平台中用于存储类文件、资源文件和其他相关...
- **包含外部库:** Fat Jar插件的一个显著优势是可以将项目中的外部库(例如第三方jar文件)一同打包进最终的Jar文件中。 - **完成打包:** 点击“Finish”按钮完成Jar文件的生成。 #### 二、将Jar文件转换为可...
标题中的问题“无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl”指出,这可能是Java Web应用开发中遇到的一个常见错误,涉及到JSP(JavaServer Pages)和JSTL(Java...
在Windows系统中,JAR文件不能像EXE文件那样双击直接运行,因为操作系统不知道如何执行Java字节码。为了解决这个问题,我们可以创建一个批处理(BAT)文件来调用Java虚拟机(JVM)执行JAR文件。下面将详细解释这个...
3. 资源压缩:JAR文件中的资源会被自动压缩,减少传输和存储占用。 六、现代Java打包工具 1. Maven:通过POM.xml配置,自动管理依赖,构建JAR、WAR等不同类型的归档文件。 2. Gradle:灵活的构建系统,支持多项目...
例如,如果你的所有类文件都在`src`目录下,且你想将它们打包到名为`myapp.jar`的Jar文件中,你可以使用以下命令: ```bash jar cvf myapp.jar -C src . ``` 这里的`-C src .`意味着从`src`目录下选择所有内容(`....
Manifest文件是Jar文件中的一个文本文件,用于描述Jar文件的元数据,包括Jar文件的名称、版本号、入口类、依赖的库文件等信息。在Eclipse中,我们可以手动编写Manifest文件,也可以让Eclipse自动生成Manifest文件。 ...
在Java开发过程中,有时我们需要对已经打包好的JAR文件中的class文件进行修改,这通常是由于修复bug、更新功能或者优化代码等原因。本文将详细介绍如何在不重新编译整个项目的情况下,修改并替换JAR文件中的class...
JAR文件是Java平台中用于打包和分发应用程序的标准格式,它包含了编译后的Java类、资源文件和元数据。这些文件通常用于运行Java应用程序或库,尤其是对于移动设备如早期的Java ME(Mobile Edition)应用。 1. **...
4. **优化类加载**:JAR文件中的类可以被Java虚拟机(JVM)优化加载,减少内存占用和提高性能。 5. **网络传输**:由于JAR文件的压缩特性,它们在网络传输时更为高效。 6. **插件系统**:许多Java应用支持通过加载...
- **类的加载**:JVM可以直接加载`jar`文件中的类,无需先解压。 - **资源文件的管理**:`jar`文件可以包含图片、配置文件等资源,便于组织和访问。 - **安全性**:`jar`文件支持数字签名,确保代码的完整性和来源。...
例如,manifest 可以指明由 JAR 文件中的哪一个文件开始运行应用程序,或者指定这个库的版本等。 要从 JAR 文件中得到它所包含的文件内容,可以使用 Java 提供的 JarFile 类,它是一个 .jar 文件自身的引用。其中的...
通过理解每个JAR文件提供的功能,我们可以更好地利用这些工具来优化我们的代码,提高应用程序的用户体验。在进行文件上传的项目时,正确使用这些库可以显著降低开发复杂度,同时提升应用程序的可靠性和效率。