精华内容
下载资源
问答
  • 程序运行,有时候需要获取jar包内内容, 例如版本更新信息,新增文本提示等有时候需要获取jar包外内容, 例如每个系统运行的环境, 系统名称等当前用的是spring clud框架获取jar包内配置文件String fileName = "文件名....

    程序运行,

    有时候需要获取jar包内内容, 例如版本更新信息,新增文本提示等

    有时候需要获取jar包外内容, 例如每个系统运行的环境, 系统名称等

    当前用的是spring clud框架

    获取到jar包内配置文件

    String fileName = "文件名.xml";

    InputStream is = this.getClass().getResourceAsStream("/"+fileName); //通过java getclass 获取到jar包内文件, 获取到输入流

    private static Map verMap = new HashMap<>();

    if (document == null)

    return;

    List> tables = document.selectNodes("UrlList"); //通过document 的方法, 解析xml

    if (tables != null && tables.size() > 0) {

    for (Object obj : tables) {

    Element urlList = (Element) obj;

    for (Object urlObj : urlList.selectNodes("url")) {

    Element urlElement = (Element) urlObj;

    String verid = urlElement.attributeValue("verid");

    String vernum = urlElement.attributeValue("vernum");

    String vertime = urlElement.attributeValue("vertime");

    String vertext = urlElement.getText();

    if (!verMap.containsKey(verid)){

    ObjectNode objectNode = Convert.newObject();

    objectNode.put("verid", verid);

    objectNode.put("vernum", vernum);

    objectNode.put("vertime", vertime);

    objectNode.put("vertext", vertext);

    verMap.put(verid, objectNode);

    }

    }

    }

    }

    2、

    1、

    通过ConfigUtil.getApplicationPath()获取到项目运行绝对地市

    File.separator 斜线, 文件夹符号

    String configPath = "file:"+ConfigUtil.getApplicationPath()+File.separator+"conf"+File.separator+"applicationContext.xml";

    展开全文
  • Java读取jar包里的文件

    2021-02-12 13:22:42
    //name是jar文件里面文件的路径public InputStream getJarInputStream( String name) throws Exception { InputStream in = this.class.getClassLoader().getResourceAsStream(name);return in; }/...

    //name是jar文件里面文件的路径public InputStream getJarInputStream( String name)            throws Exception {              InputStream in = this.class.getClassLoader().getResourceAsStream(name);

    return in;    }//entryName是jar文件里面文件的路径

    public String readFile(String entryName) {        InputStream in = null;        BufferedReader br = null;        StringBuffer sb = null;        try {            in = getJarInputStream(filePath, entryName);            br = new BufferedReader(new InputStreamReader(in, "UTF-8"));            String con = null;            sb = new StringBuffer();            while ((con = br.readLine()) != null) {                        sb.append(con);

    sb.append("\r\n");

    }        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (br != null)                    br.close();                if (in != null)                    in.close();            } catch (IOException e) {                e.printStackTrace();            }        }        return sb.toString();    }

    展开全文
  • 【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】import java.io.*;...import java.util.jar.Ja...

    【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

    import java.io.*;

    import java.util.Enumeration;

    import java.util.LinkedList;

    import java.util.List;

    import java.util.jar.JarEntry;

    import java.util.jar.JarFile;

    import java.util.jar.JarOutputStream;

    /**

    * jarPath: jar包所在路径

    * jarFilePath: jar中想要修改文件所在的路径

    * regex:正则表达式

    * replacement:替换的字符串

    * 注意:Jar包内的jar包内的文件不适用!

    */

    public class JarTool {

    public void change(String jarPath, String jarFilePath, String regex, String replacement) throws IOException {

    File file = new File(jarPath);

    JarFile jarFile = new JarFile(file);// 通过jar包的路径 创建Jar包实例

    change(jarFile, jarFilePath, regex, replacement);

    }

    public void change(JarFile jarFile, String jarFilePath, String regex, String replacement) throws IOException {

    JarEntry entry = jarFile.getJarEntry(jarFilePath);//通过某个文件在jar包中的位置来获取这个文件

    //创建该文件输入流

    InputStream input = jarFile.getInputStream(entry);

    //获取entries集合lists

    List lists = new LinkedList<>();

    Enumeration entries = jarFile.entries();

    while (entries.hasMoreElements()) {

    JarEntry jarEntry = entries.nextElement();

    lists.add(jarEntry);

    }

    String s = readFile(input, regex, replacement);// 读取并修改文件内容

    writeFile(lists, jarFilePath, jarFile, s);// 将修改后的内容写入jar包中的指定文件

    jarFile.close();

    }

    private static String readFile(InputStream input, String regex, String replacement)

    throws IOException {

    InputStreamReader isr = new InputStreamReader(input);

    BufferedReader br = new BufferedReader(isr);

    StringBuilder buf = new StringBuilder();

    String line;

    while ((line = br.readLine()) != null) {

    // 此处根据实际需要修改某些行的内容

    buf.append(line);

    buf.append(System.getProperty("line.separator"));

    }

    br.close();

    return buf.toString().replaceAll(regex, replacement);

    }

    private static void writeFile(List lists, String jarFilePath,

    JarFile jarFile, String content) throws IOException {

    FileOutputStream fos = new FileOutputStream(jarFile.getName(), true);

    JarOutputStream jos = new JarOutputStream(fos);

    try {

    for (JarEntry je : lists) {

    if (je.getName().equals(jarFilePath)) {

    // 将内容写入文件中

    jos.putNextEntry(new JarEntry(jarFilePath));

    jos.write(content.getBytes());

    } else {

    //表示将该JarEntry写入jar文件中 也就是创建该文件夹和文件

    jos.putNextEntry(new JarEntry(je));

    jos.write(streamToByte(jarFile.getInputStream(je)));

    }

    }

    } catch (Exception e) {

    e.printStackTrace();

    } finally {

    // 关闭流

    jos.close();

    }

    }

    private static byte[] streamToByte(InputStream inputStream) {

    ByteArrayOutputStream outSteam = new ByteArrayOutputStream();

    try {

    byte[] buffer = new byte[1024];

    int len;

    while ((len = inputStream.read(buffer)) != -1) {

    outSteam.write(buffer, 0, len);

    }

    outSteam.close();

    inputStream.close();

    } catch (IOException e) {

    e.printStackTrace();

    }

    return outSteam.toByteArray();

    }

    public static void main(String[] args) throws IOException {

    JarTool jarTool = new JarTool();

    jarTool.change("D:\\IDEA\\workSpace\\demo.jar"

    , "spring/spring-aop.xml", "expression=\".*\"", "expression=\"%%\"");

    }

    }

    版权声明

    【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

    展开全文
  • 在使用 jar 执行 java 代码时,有一...以classpath 开头的 URL 表示该文件为jar包内文件的路径.如:classpath://config/app.config表示jar包根路径config文件夹下的app.config文件以file开头的URL表示该文件为jar 包外...

    在使用 jar 执行 java 代码时,有一个需求是从 jar 包所在目录的同级目录下读取配置文件的需求,从网上找了很多方法感觉都挺复杂的,

    在这里总结一下.

    以classpath 开头的 URL 表示该文件为jar包内文件的路径.

    如:classpath://config/app.config表示jar包根路径config文件夹下的app.config文件

    以file开头的URL表示该文件为jar 包外文件的路径

    如:file://./config/app.config表示

    摘要

    // 当前我想从jar包的同级目录下读取一个名为 'config.txt'的文件的话,我需要指定目录为.

    File file = new File(".","config.txt")

    说明

    File file = new File("config.txt")

    当只包含文件名称时,java程序会默认尝试从jar包的根路径去读取文件,当尝试使用 file.getCanonicalPath() 方法读取时,便会得到该文件在jar包内的路径.

    示例

    我当前的工程的路径为D:\WorkSpace\path_demo01\

    在工程执行以下java代码:

    当指定parent时:

    会从parent下查找path资源.

    log(FileUtil.file(".", "/config/app.config").getCanonicalPath());

    log(FileUtil.file(".", "config/app.config").getCanonicalPath());

    // D:\WorkSpace\path_demo01\config\app.config

    //加载与当前jar包同级目录下的文件

    log(FileUtil.file(".", "app.config").getCanonicalPath());

    当没有指定parent:

    如果path为绝对路径时,会从绝对路径下查找

    如果path为相对路径时,会从classpath的根路径下开始查找

    log(FileUtil.file("/config/app.config").getCanonicalPath());

    // D:\config\app.config

    log(FileUtil.file("config/app.config").getCanonicalPath());

    // D:\WorkSpace\path_demo01\target\classes\config\app.config

    通过当前类加载资源:

    如果path为相对路径会指定要加载的资源路径与当前类所在包的路径一致

    如果path为绝对路径,那么就会从classpath的根路径下开始查找

    log(App.class.getResource("/config/app.config"));

    // file:/D:/WorkSpace/path_demo01/target/classes/config/app.config

    log(App.class.getResource("config/app.config"));

    // file:/D:/WorkSpace/path_demo01/target/classes/top/ghimi/config/app.config

    通过类加载器加载资源:

    默认是从ClassPath根下获取,path不能以/开头,最终是由ClassLoader获取资源.

    log(App.class.getClassLoader().getResource("/config/app.config"));

    // null

    log(App.class.getClassLoader().getResource("config/app.config"));

    // file:/D:/WorkSpace/path_demo01/target/classes/config/app.config

    加载jar包内的资源

    当代码打包成jar包的形式后,是无法通过new File()的形式加载jar包内的资源的.此时有可能抛出

    FileNotFoundException异常,是由于将path当成jar包外的目录查找不到资源导致的.

    URI is not hierarchical异常,是由于无法直接读取jar包中资源(透明)而抛出的异常.

    解决方法:

    使用 getResourceAsStream()方法直接获取资源的流而不是getResource()获取资源文件对象的方式读取资源.

    //修改前,未打包成jar包时能够正常执行,打包后会抛出异常

    log(App.class.getClassLoader().getResource("config/app.config"));

    // 修改后,打成jar包后也可以正常加载资源

    log(App.class.getClassLoader().getResourceAsStream("config/app.config"));

    加载jar包外的资源

    会从parent目录下查找path资源.

    //加载与当前jar包同级目录下的文件

    log(FileUtil.file(".", "app.config").getCanonicalPath());

    // D:\WorkSpace\path_demo01\app.config

    //加载与当前jar包的上一级目录下的文件

    log(FileUtil.file("..", "app.config").getCanonicalPath());

    // D:\WorkSpace\app.config

    借用工具hutool:

    cn.hutool

    hutool-all

    4.5.6

    补充知识:java中jar包内的类访问jar包内部的资源文件的路径问题

    在本地项目中,若我们要访问项目中的资源文件,则一般使用相对路径或者用System.getProperities("user.dir")得到项目根目录,然后再访问资源文件,但是在将该工程和资源文件打包为jar包,运行该jar文件时,会显示找不到资源文件的错误。

    在如下项目结构树中,项目根目录为nlpir,如果我们要在src下的某个package的某个java文件中访问blackWhite文件夹中的文件,则相对路径为"blackWhite/....."即可。但是在打包为jar包时,即使我们把blackWhite文件夹同样加入到打包的文件行列,在运行该jar包时,会出错:找不到blackWhite中某文件的路径。

    8ca44fc4bcdd12909a6b000fb8b07972.png

    解决方法:

    使用Class.getResource或者是ClassLoader.getResourceAsStream()将文件内容放到InputStream中,具体使用如下:

    String s1 = this.getClass().getResource("/library.properties").getPath();

    或者为:

    String s1 = CodeTest.class.getResource("/library.properties").getPath();

    注意,使用class的getRescource时,要注意路径前要加"/",即根目录,此处的根目录是src

    若像如下使用:

    String class_str = this.getClass().getResource("logback.xml").getPath();

    则会出错如下:

    3190490f9571faa8a29ebfea9845753f.png

    使用ClassLoader时,如下:

    this.getClass().getClassLoader().getResource()

    在使用ClassLoader时,路径前面不能加"/",使用相对路径。

    如下示例:

    @Test

    public void test4(){

    String class_str = this.getClass().getResource("/logback.xml").getPath();

    String class_str2 = TempTest.class.getResource("/logback.xml").getPath();

    String classLoader_str = this.getClass().getClassLoader().getResource("logback.xml").getPath();

    InputStream is = this.getClass().getClassLoader().getResourceAsStream("logback.xml");

    System.out.println(class_str);

    System.out.println(class_str2);

    System.out.println(classLoader_str);

    System.out.println(is == null );

    }

    结果如下:

    bd8eba3ec3b4668186b18e2b65da2277.png

    String ss = TempTest.class.getResource("/").getPath();

    上述该代码得到的是项目的根目录,即nlpir的根目录,结果如下:

    /C:/eclipse/eclipse/workspace/nlpir/out/production/nlpir/

    如下代码:

    @Test

    public void readProperties(){

    String ss = TempTest.class.getResource("/").getPath();

    System.out.println(ss);

    String s = new File(ss).getParentFile().getPath();

    System.out.println(s);

    String system_str = System.getProperty("user.dir");

    System.out.println(system_str);

    }

    运行结果如下:

    38f6c58fba5576acfc7e48e6a7a56bb3.png

    其中,File.getParentFile()可用于求父目录

    将上述readProperties函数打包为jar包在命令行使用java -jar TempTest.jar运行时,结果如下:

    a732c4453d29e08af7f2b8f73e000453.png

    由此可见,打包成jar包时和在ide中直接运行的结果并不一样,所以在jar包中的class类要访问自己jar包中的资源文件时,应该使用Class.getResource或者是getResourceAsStream放在InputStream中,再进行访问。但是该方法只能访问到src下的资源文件,因为其根目录对应的就是src,无法访问到项目根目录下src外的文件,如上述项目结构图中的blackWhite中的文件无法访问到,解决方法还木有找到。。。。。。

    当jar包外部的类需要访问某个jar包的资源文件时,使用JarFile类,

    具体使用方法如下:

    如果你对于常用的ZIP格式比较熟悉的话,JAR文件也就差不多。JAR文件提供一种将多个文件打包到一个文件中的方法,其中每一个文件可能独立地被压缩。JAR文件所增加的内容是manifest,它允许开发者可以提供附加的关于内容的信息。例如,manifest表明JAR文件中的哪个文件是用来运行一个程序的,或者库的版本号等。

    J2SEDK提供了一个JAR工具,你可以用它从控制台读写JAR文件。然而,如果你需要在程序中代码读写JAR文件,可能需要一点时间(本文只包含如何在程序中读写JAR文件)。好消息是你可以做到这一点,而且你不用担心解压的事,因为类库将帮助你完成这些。

    首先,通过把将JAR文件位置传给构造函数,创建一个JarFile的实例,位置可能是String或File的形式,如下:

    JarFile jf = new JarFile("C:/jxl.jar");

    或者为:

    File file = new File("C:/jxl.jar");

    JarFile jarFile = new JarFile(file);

    你可能注意到当文件不在class path中时,JarFile类对于从JAR中读取文件文件是很有用的。当你想指定目标JAR文件时,JarFile类对于从JAR中读取文件同样也很有用。

    当然,如果JAR文件在class path中,从其中读取文件的方法比较简单,你可以用下面的方法:

    URL url = ClassLoader.getSystemResource(name);

    或者为:

    InputStream stream =

    ClassLoader.getSystemResourceAsStream("javax/servlet/LocalStrings_fr.properties");

    当你有了该JAR文件的一个引用之后,你就可以读取其文件内容中的目录信息了。JarFile的entries方法返回所有entries的枚举集合 (Enumeration)。通过每一个entry,你可以从它的manifest文件得到它的属性,任何认证信息,以及其他任何该entry的信息,如它的名字或者大小等。

    Enumeration enu = jf.entries();

    while (enu.hasMoreElements()) {

    JarEntry element = (JarEntry) enu.nextElement();

    String name = element.getName();

    Long size = element.getSize();

    Long time = element.getTime();

    Long compressedSize = element.getCompressedSize();

    System.out.print(name+"/t");

    System.out.print(size+"/t");

    System.out.print(compressedSize+"/t");

    System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(new Date(time)));

    }

    为了从JAR文件中真正读取一个指定的文件,你必须到其entry的InputStream。这和JarEntry不一样。这是因为JarEntry只是包含该entry的有关信息,但是并不实际包含该entry的内容。这和File和FileInputStream的区别有点儿相似。访问文件没有打开文件,它只是从目录中读取了该文件的信息。

    下面是如何得到entry的InputStream:

    InputStream input = jarFile.getInputStream(entry);

    当你有了输入流,你就可以像读取其他流一样读取它。在文本流中(text stream),记得使用读取器(Reader)从流中取得字符。对于面向字节的流,如图片文件,直接读取就行了。

    示例:

    下面的程序演示如何从JAR文件中读取文件。指定JAR文件的名称,要读取的文件的名称(打包JAR文件中的某一个文件)作为参数来调用该程序。要读取的文件应该有一个文本类型的。

    import java.io.*;

    import java.util.jar.*;

    public class JarRead {

    public static void main (String args[])

    throws IOException {

    if (args.length != 2) {

    System.out.println(

    "Please provide a JAR filename and file to read");

    System.exit(-1);

    }

    JarFile jarFile = new JarFile(args[0]);

    JarEntry entry = jarFile.getJarEntry(args[1]);

    InputStream input = jarFile.getInputStream(entry);

    process(input);

    jarFile.close();

    }

    private static void process(InputStream input)

    throws IOException {

    InputStreamReader isr =

    new InputStreamReader(input);

    BufferedReader reader = new BufferedReader(isr);

    String line;

    while ((line = reader.readLine()) != null) {

    System.out.println(line);

    }

    reader.close();

    }

    }

    假设在myfiles.jar文件中有一个spider.txt文件,spider文件的内容如下:

    The itsy bitsy spider

    Ran up the water spout

    Down came the rain and

    Washed the spider out

    可以通过下面的命令在命令行来显示该文本文件的内容:

    java JarRead myfiles.jar spider.txt

    以上这篇Java 获取 jar包以外的资源操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    展开全文
  • 这有效(在IDE和JAR中)但这样我无法获得文件的路径,只有文件内容:ClassLoader classLoader = getClass().getClassLoader();PrintInputStream(classLoader.getResourceAsStream("config/netclient.p"));如果我这样做...
  • 但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了。看看下面的代码:Java代码//源代码1:packageedu.hxraid;importjava.io.*;publicclassResource{publicvoidgetResource()thr...
  • 本文实例讲述了从Javajar文件中读取数据的方法。分享给大家供大家参考。具体如下:Java 档案 (Java Archive, JAR) 文件是基于 Java 技术的打包方案。它们允许开发人员把所有相关的内容 (.class、图片、声音和支持...
  • 我们有时候在idea环境下读取工程内文件用className.class.getResourceAsStream()是可以成功的,但是打成jar包发布后就读取不到,报错:java.io.FileNotFoundException: file:/app.jar!/BOOT-INF/classes!所以我们...
  • 方式一: this.getClass().getClassLoader().getResourceAsStream(String name)首先调用对象的getClass()方法是获得对象当前的类类型,这部分数据存在方法区,而后在类类型上调用getClassLoader()方法是得到当前类型...
  • 开发这个小工具的初衷是为了修改工具 jar 包中的配置文件本来打算将这个功能集成到 工具 jar 自身但是这里貌似有点儿问题,因为该 jar 包文件当前正在被 java 虚拟机使用,所以无法对其进行修改操作~这里我有点儿...
  • 但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了。看看下面的代码://源代码1:packageedu.hxraid;import java.io.*;public classResource {public void getResource() thr.....
  • 获取jar包内文件File。
  • Java 读取jar包内资源文件: # 读取jar 包内资源文件application.properties InputStream appPropertiesInputStream = ApplicationPropertiesHolder.class .getClassLoader().getResourceAsStream("application...
  • jar包读取jar包内部和外部的配置文件,springboot读取外部配置文件的方法用系统属性System.getProperty("user.dir")获得执行命令的目录(网上很多说是jar包的当前目录是错误的)注:如果在docker里面运行在jar同目录...
  • 但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了。看看下面的代码:Java代码//源代码1:packageedu.hxraid;importjava.io.*;publicclassResource{publicvoidgetReso...
  • 打包部署后无法读取jar包里的文件 ...比如要读取的文件位于类路径下 java/main/resources/myfile.txt,这个文件在项目打成jar包的时候,也会压缩在里头,非常方便。 用 this.getClass().getResource(resource
  • 源自:http://blog.csdn.net/b_h_l/article/details/7767829在...但当打包成一个可执行的jar包(将资源文件一并打包)以后,这些资源文件找不到,如下代码:Java代码//源代码1:packageedu.hxraid;importjava.io.*;pu...
  • 这给你留下几个选项:(a)对于任何给定的JAR文件,您可以列出该JAR文件中的条目,找到.class文件,然后确定每个.class文件表示哪个Java类;或者(b)您可以使用为您执行此操作的库。选项(a):手动扫描JAR文件在这个选项...
  • 我们都知道springboot默认的方式是打包成jar包执行的,这个时候如果需要遍历某个路径下的所有文件夹和文件,按照我们常规的方式是使用File来处理,但是这里由于是jar包,所以使用File类会出现找不到路径的错误,本文...
  • 写作业的时候要输出一个record.dat文件jar包的同级目录,但是不知道怎么定位jar包的路径。百度到的方法不很靠谱,所以在这里记录一下。一:使用类路径1 String path = this.getClass().getProtectionDomain()....
  • 但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了。看看下面的代码:Java代码//源代码1:packageedu.hxraid;importjava.io.*;publicclassResource{publicvoidgetResource()th....
  • 在开发过程中,在idea开发工具环境下是能正常运行的,但由于测试时,需要将模块打包,就将subMoudle工程打成了一个jar放在mainMoudle下,跑jar包时就发现不能运行了,控制台抛出了fileNotFoundException的异常信息。...
  • 通过给定的包名,获取到该资源路径,然后判断该路径是文件夹还是jar包。 如果是文件夹,直接通过 File.listFile() 方法获取所有文件,然后找到类文件。 如果是 jar 包的话,则通过 jarInputStream 构造 jarEntry ...
  • 文件存到 jar 直接在项目中通过 fileName/textName.text来生成,会在target中的com同级目录生成指定文件 注意 相对路径前面是不要/的 /** * 生成证书文件 * * @param x509Certificate 证书 * @param ...
  • 拿到手的有软件直接能运行的jar包。一开始的想法比较简单,就想直接反编译代码,然后修改后重新打包,使用的是一直比较钟爱的jd-gui。不过之后发现没有那么简单,由于这个软件功能比较多,代码比较繁琐,反编译之后...
  • 本文实例讲述了Java实现从jar包中读取指定文件的方法。分享给大家供大家参考,具体如下:以下的Java代码实现了从一个jar包中读取指定文件的功能:/*** This class implements the funcationality of reading and ...
  • 无论是在Windows还是Linux操作系统下,绝对... 相对路径:相对于目前路径的文件命令行运行jar包,如何使用与jar包在同一个目录的配置文件。其实就是当前的工作目录问题。在eclipse中:在编写《资料收集库》的网页...
  • 关于jar读取文件路径的这个问题可愁死我了!(以下内容如有不准确,或错误的地方请留言.我会积极配合领导去查证并更正我的错误.)先看项目树:(对应项目Open in Terminal — tree >>E:\tree.txt)E:.└─src└─main...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 170,495
精华内容 68,198
关键字:

java获取jar包内的文件

java 订阅