JAVA打包后读取自身JAR中的文件
Java实现从jar包中读取指定文件的方法

Java实现从jar包中读取指定⽂件的⽅法本⽂实例讲述了Java实现从jar包中读取指定⽂件的⽅法。
分享给⼤家供⼤家参考,具体如下:以下的Java代码实现了从⼀个jar包中读取指定⽂件的功能:/*** This class implements the funcationality of reading and writing files in jar files.*/package com.leo.util;import java.io.InputStream;import java.io.FileOutputStream;import java.util.jar.*;import java.util.Enumeration;/*** @author Leo Share* @since 08/09/2007* @version 1.0*/public class JarFileAccess {private static final String fileSeparator = System.getProperty("file.separator");public void accessJarFile(String jarFileName, String fromDir, String toDir) throws Exception{JarFile myJarFile = new JarFile(fromDir+fileSeparator+jarFileName);Enumeration myEnum = myJarFile.entries();while(myEnum.hasMoreElements()){JarEntry myJarEntry = (JarEntry)myEnum.nextElement();if(myJarEntry.getName().equals("jbossall-client.jar")){InputStream is = myJarFile.getInputStream(myJarEntry);FileOutputStream fos = new FileOutputStream(toDir+fileSeparator+myJarEntry.getName());byte[] b = new byte[1024];int len;while((len = is.read(b))!= -1){fos.write(b, 0, len);}fos.close();is.close();break;} else{continue;}}myJarFile.close();}}更多关于java算法相关内容感兴趣的读者可查看本站专题:《》、《》、《》和《》希望本⽂所述对⼤家java程序设计有所帮助。
解决SpringBootjar包中的文件读取问题

解决SpringBootjar包中的⽂件读取问题前⾔SpringBoot微服务已成为业界主流,从开发到部署都⾮常省时省⼒,但是最近⼩明开发时遇到⼀个问题:在代码中读取资源⽂件(⽐如word⽂档、导出模版等),本地开发时可以正常读取,但是,当我们打成jar包发布到服务器后,再次执⾏程序时就会抛出找不到⽂件的异常。
背景这个问题是在⼀次使⽤freemarker模版引擎导出word报告时发现的。
⼤概说⼀下docx导出java实现思路:导出word的⽂档格式为docx,事先准备好⼀个排好版的docx⽂档作为模版,读取解析该模版,将其中的静态资源替换再导出。
docx⽂档本⾝其实是⼀个压缩的zip⽂件,将其解压过后就会发现它有⾃⼰的⽬录结构。
问题这个docx⽂档所在⽬录如下图所⽰:在本地调试时,我使⽤如下⽅式读取:import org.springframework.util.ResourceUtils;public static void main(String[] args) throws IOException {File docxTemplate = ResourceUtils.getFile("classpath:templates/docxTemplate.docx");}可以正常解析使⽤,但是打包发布到beta环境却不可⽤。
抛出异常如下:java.io.FileNotFoundException: class path resource [templates/docxTemplate.docx] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/usr/local/subject-server.jar!/BOOT-INF/classes!/templates/docxTe显⽽易见,这个异常告诉我们:没有找到⽂件,但是将jar包解压过后,发现这个⽂件是真真实实存在的。
java 根据路径获取文件方法

java 根据路径获取文件方法Java是一种广泛应用于软件开发的高级编程语言。
在Java中,我们经常需要根据路径获取文件。
本文将介绍如何使用Java来实现这一功能,并提供一步一步的指导。
第一步:导入相关的Java类库要使用Java来获取文件,我们需要导入相关的Java类库。
在这个场景下,我们需要导入java.io类库中的File类。
在Java中,File类提供了一些方法来操作文件和目录。
要导入File类,我们可以在Java源文件的开头添加以下代码:javaimport java.io.File;第二步:创建File对象在Java中,要获取文件,我们需要先创建一个File对象。
File对象代表文件系统中的一个文件或目录。
我们可以使用其构造函数来创建一个File 对象,构造函数可以接受文件路径作为参数。
以下是一个创建File对象的示例代码:javaString path = "C:\\myFolder\\myFile.txt";File file = new File(path);在上面的示例中,我们创建了一个名为file的File对象,该对象代表了路径为C:\myFolder\myFile.txt的文件。
请注意,在Java中,文件路径使用双反斜杠(\)来表示文件分隔符。
第三步:检查文件是否存在在创建File对象后,我们可以使用其exists()方法来检查文件是否存在。
exists()方法返回一个布尔值,如果文件存在,则返回true,否则返回false。
以下是一个检查文件是否存在的示例代码:javaif (file.exists()) {System.out.println("文件存在");} else {System.out.println("文件不存在");}第四步:获取文件的绝对路径要获取文件的绝对路径,我们可以使用File对象的getAbsolutePath()方法。
用于解压jar文件的命令

用于解压jar文件的命令在软件开发过程中,我们经常会遇到需要解压jar文件的情况。
jar 文件是一种Java归档文件,包含了Java程序的类、资源文件等。
解压jar文件可以帮助我们查看、修改和提取其中的内容。
本文将介绍一些常用的命令,以帮助您轻松完成jar文件的解压操作。
一、使用jar命令解压jar文件jar命令是Java开发工具包(JDK)自带的命令行工具,可以用于创建、查看和解压jar文件。
要解压jar文件,可以使用以下命令:jar -xf <jar文件名>例如,要解压名为example.jar的jar文件,可以运行以下命令:jar -xf example.jar执行该命令后,jar文件将被解压到当前目录下的一个与文件名相同的文件夹中。
您可以在该文件夹中查看和修改jar文件中的内容。
二、使用unzip命令解压jar文件除了jar命令,还可以使用unzip命令解压jar文件。
unzip命令是Linux和Unix系统中常用的解压命令,也可以用于解压jar文件。
要解压jar文件,可以使用以下命令:unzip <jar文件名>例如,要解压名为example.jar的jar文件,可以运行以下命令:unzip example.jar执行该命令后,jar文件将被解压到当前目录下。
您可以在当前目录中查看和修改jar文件中的内容。
三、使用7-Zip解压jar文件除了命令行工具,还可以使用图形化界面的压缩软件7-Zip来解压jar文件。
7-Zip是一款开源的压缩软件,支持多种格式的压缩文件,包括jar文件。
要解压jar文件,可以按照以下步骤进行操作:1. 下载并安装7-Zip软件;2. 打开7-Zip软件,找到要解压的jar文件;3. 右键点击jar文件,选择“7-Zip”菜单,然后选择“解压到指定文件夹”;4. 选择解压的目标文件夹,点击“确定”按钮。
执行以上步骤后,jar文件将被解压到指定的文件夹中。
Java读取jar包资源文件

Java读取jar包资源⽂件把java项⽬打包成jar包,如果jar包中存在资源⽂件需要访问,需要采取stream的形式访问,可以调⽤getResourceAsStream()⽅法,⽽不能采⽤路径的⽅式访问(⽂件已经被打到jar⾥⾯了,不符合路径的)。
使⽤getResourceAsStream()⽅法⽂件可以有两种⽅式存放:(1)⽂件存放在src的类路径下。
(2)⽂件存放在资源⽂件夹下⾯,通过Build Path—Use as Source Folder来把普通⽂件夹变成资源⽂件夹。
如图,把testA打包成jar包,导⼊testB中(Build Path—Add To Build Path),在testB中访问testA.txt和testB.txt。
1 @Test2public void test() {3 String line = null;4 BufferedReader bufferReader = null;5try {6 InputStream inputStream = App.class.getResourceAsStream("testA.txt");7 bufferReader = new BufferedReader(new InputStreamReader(inputStream));8while((line = bufferReader.readLine()) != null) {9 System.out.println(line);10 }11 } catch(Exception e) {12 e.printStackTrace();13 } finally {14try {15 bufferReader.close();16 } catch (IOException e) {17 e.printStackTrace();18 }19 }20 }访问testB时要把获取inputStream语句改为InputStream inputStream = App.class.getResourceAsStream("/testB.txt")。
java读JAR包里的配置文件

private static String getXmlContent()throws IOException {Reader f = newInputStreamReader(QueryWeather.class.getClass().getResourceAsStream("/weather/we ather.xml"));BufferedReader fb = new BufferedReader(f);StringBuffer sb = new StringBuffer(“”);String s = "";while((s = fb.readLine()) != null) {sb = sb.append(s);}return sb.toString();}package com.read;import java.io.*;public class Resource {public void getResource() throws IOException{//返回读取指定资源的输入流InputStream is=this.getClass().getResourceAsStream("/struts-default.xml"); BufferedReader br=new BufferedReader(new InputStreamReader(is));String s="";while((s=br.readLine())!=null)System.out.println(s);}}这个类是jar包中的类,同时jar根下还有个struts-default.xml文件。
ClassLoader classloader = Thread.currentThread().getContextClassLoader(); InputStream is = classloader.getResourceAsStream("com/xxx/xxxx/yourfile.xml");一般情况下properties文件都是在工程内使用的,如果application打成jar包之后,修改properties文件后就需要重新打jar,很麻烦。
如何读取jar包中的文件

如何读取jar包中的⽂件1.getResource//当前类⽂件为根⽬录,取其⼦⽬录x下的y⽂件Main.class.getResource("x/y")//当前类⽂件的根⽬录为根⽬录,取其⼦⽬录x下的y⽂件Main.class.getResource("/x/y")上⾯的解释有点拗⼝,其实就是路径不以斜线开头,表⽰从当前class⽂件为根⽬录,然后找⽂件,路径以斜线开头,则从当前class的⽂件的根⽬录,⽐如当前class如果有包限定的话,那就是从包的最顶层,作为根⽬录,来加载⽂件。
2.getResourceAsStreamprivate static String readFile(String file) throws IOException {InputStream input = null;BufferedInputStream bis = null;StringBuilder sb = new StringBuilder();try {input = Main.class.getResourceAsStream(file);bis = new BufferedInputStream(input);byte[] temp = new byte[1024];int len;while ((len = bis.read(temp)) != -1) {sb.append(new String(temp, 0, len, StandardCharsets.UTF_8));}} finally {if (bis != null) {bis.close();}if (input != null) {input.close();}}return sb.toString();}这⾥要注意的是,上⾯的写法中是Main.class.getResourceAsStream(file),即从当前类的范围内去找file,如果写成Main.class.getClassLoader().getResourceAsStream(file),则有可能找不到⽂件,因为已经从加载器的可见范围去找⽂件了。
JAVA打包后读取自身JAR中的文件

标签:分类:Computer and I杂谈在编写完Java程序后,打包成Jar时发布,会发现找不到Jar文件中的图片和文本文件,其原因是程序中载入图片或文本文件时,使用了以当前工作路径为基准的方式来指定文件和路径。
这与用户运行Jar包时的当前工作路径并不一致。
问题分析:例如:以Windows为例说明,以下是开发项目“AAA”的部分代码,开发和调试时的根路径为D:\aaa,这样程序运行时当前路径为"D:\aaa",大家可以用System.getProperty("user.dir")方法求证当前用户工作路径。
//下面代码使用了基于当前工作路径的方式指定了文件对象File imageFile = new File("/images/sample.gif");ImageIcon imageIcon = new ImageIcon(File.toURI);File iniFile = new File("/conf.ini");FileInputStream fileInputStream = new FileInputStream(iniFile.toU RI);以上的代码应用绝对路径信息指定了文件对象,在开发和调试期(未打包前),是没有问题的,但在打包后,由于所有图片文件和文本文件都将打包到Jar文件中,由于System中的"user.dir"属性发生了变化,会造成用绝对路径的方式无法找到Jar文件中包含路径和文件。
例如大家将上面的项目“AAA”中的所有类文件、图片文件和文本文件等打包为E:\aaa.jar文件并发布,在用户执行该aaa.jar中的程序时,当前路径取决于用户运行该程序的当前路径。
例如: 在“E:\”目录下运行该程序:E:\> java -jar aaa.jar此时用户的当前路径(System的user.dir属性)是“E:\”,而非开发者所期望的“E:\aaa”,所以会按以下路径来搜索文件:E:\images\sample.gifE:\conf.ini但是所有的图片和文本文件包含在E:\aaa.jar文件中,所以会致使程序无法正常运行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
以上两行代码采用了下面两条 Java 语句: getClass().getResourceAsStream("FileName"); getClass().getResource("File"); 含有这种代码的程序在运行时, 以类 (类路径) 为基准, 而不依赖当前路径 (System 中的 user.dir)。 注意:上面的路径"/image/Environment.ini"如果写成 "image/Environment.ini",将表示在类同路径下的路径 (className/image/Environment.ini),这需要您必须将图片和文本等文件的 保存路径,和程序中指定的路径两者保持一致。 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class Test { public Test (){ try { // "/Test/123.txt" 相对于包的路径,区分大小写 InputStream input= this .getClass () .getResourceAsStream ( " /image/sample.gif " ) ; System.out.println ( this .getClass () .getResource ( "/ conf.ini " )) ; BufferedReader in= new BufferedReader ( new InputStreamReader ( input )) ; String a; while ( true ){ a=in.readLine () ; if ( a== null ) break ; System.out.println ( a+ "-----" ) ; } in.close () ; } catch ( IOException e ) { e.printStackTrace () ; } } public static void main ( String [] args ){ new Test () ; } }
标签: 分类: Computer and I
杂谈Biblioteka 在编写完 Java 程序后,打包成 Jar 时发布,会发现找不到 Jar 文件中的图片和 文本文件, 其原因是程序中载入图片或文本文件时,使用了以当前工作路径为基 准的方式来指定文件和路径。这与用户运行 Jar 包时的当前工作路径并不一致。 问题分析: 例如:以 Windows 为例说明,以下是开发项目“AAA”的部分代码,开发和调试 时的根路径为 D:\aaa,这样程序运行时当前路径为"D:\aaa",大家可以用 System.getProperty("user.dir")方法求证当前用户工作路径。 //下面代码使用了基于当前工作路径的方式指定了文件对象 File imageFile = new File("/images/sample.gif"); ImageIcon imageIcon = new ImageIcon(File.toURI); File iniFile = new File("/conf.ini"); FileInputStream fileInputStream = new FileInputStream(iniFile. toURI); 以上的代码应用绝对路径信息指定了文件对象,在开发和调试期(未打包前), 是没有问题的, 但在打包后,由于所有图片文件和文本文件都将打包到 Jar 文件 中,由于 System 中的"user.dir"属性发生了变化,会造成用绝对路径的方式无 法找到 Jar 文件中包含路径和文件。 例如大家将上面的项目 “AAA”中的所有类 文件、图片文件和文本文件等打包为 E:\aaa.jar 文件并发布,在用户执行该 aaa.jar 中的程序时,当前路径取决于用户运行该程序的当前路径。 例如: 在“E:\”目录下运行该程序: E:\> java -jar aaa.jar 此时用户的当前路径(System 的 user.dir 属性)是“E:\”,而非开发者所期 望的“E:\aaa”,所以会按以下路径来搜索文件: E:\images\sample.gif E:\conf.ini 但是所有的图片和文本文件包含在 E:\aaa.jar 文件中,所以会致使程序无法正 常运行。 问题解决: 为了解决上述问题,推荐采用 Java 本身以类为基准的路径搜索方式。 例如: /* *以下代码采用了以当前类为基准的路径指定方式。下面这行代码在运行时, 会 *在 jar 文件中的根路径,搜索程序中用到的文件。 Reader reader =new InputStreamReader( getClass().getResourceAsStream("/image/Environment.ini ")); ImageIcon i=new ImageIcon(getClass().getResource("/image/b1.gif")) ;