Java 在构建的应用程序中获取资源
当我的应用程序运行时,我想在文件夹中获取文件,所以我知道我需要将其作为资源获取,如果我将其作为文件获取,它将不起作用,所以这就是我所做的Java 在构建的应用程序中获取资源,java,Java,当我的应用程序运行时,我想在文件夹中获取文件,所以我知道我需要将其作为资源获取,如果我将其作为文件获取,它将不起作用,所以这就是我所做的 jaxbContext = JAXBContext.newInstance(Catalogo.class); jaxbUnmarshaller = jaxbContext.createUnmarshaller(); InputStream resourceAsStream = getClass().getClas
jaxbContext = JAXBContext.newInstance(Catalogo.class);
jaxbUnmarshaller = jaxbContext.createUnmarshaller();
InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream("catalogos/");
BufferedReader br = new BufferedReader(new InputStreamReader(resourceAsStream));
String line;
try {
while((line = br.readLine()) != null){
InputStream resourceAsStream1 = getClass().getClassLoader().getResourceAsStream("catalogos/"+line);
tempCat = (Catalogo) jaxbUnmarshaller.unmarshal(resourceAsStream1);
if(tempCat != null){
codigoCurso = String.valueOf(tempCat.getCourse().getId());
nomeDoCurso = dados.get(codigoCurso);
anoCatalogo = String.valueOf(tempCat.getAno());
if(nomeDoCurso == null){
dados.put(codigoCurso, tempCat.getCourse().getNome());
}
anos.add(anoCatalogo);
}
}
我想做的是,获取文件夹(
/catalogos/
)中的所有文件,并循环遍历每个文件并将其解组到一个对象,以便能够访问所需的属性。因此,当我用netbeans运行这个程序时,效果非常好,但是当我构建并运行jar时,我没有得到使用netbeans得到的相同结果,我的意思是,数据不是我所期望的。下面的示例演示了如何从当前可运行jar文件的目录中获取文件并读取这些文件的内容
假设您有一个名为“FolderTestApp”的NetBeans项目。执行以下步骤:
FolderTestApp\
create文件夹myFiles
catalogos
文件夹复制到FolderTestApp\myFiles\
myFiles
文件夹是在生成项目jar时在jar文件结构中保留catalogos
文件夹所必需的myFiles
文件夹将从jar文件中消失,但catalogos
文件夹将保留
如果不执行这些步骤,并将catalogos
直接放在项目文件夹中(而不是作为myFiles的子文件夹),则catalogos文件夹中的文件将放在jar文件的根目录中
myFiles
文件夹添加为netbeans项目属性中的源文件夹key11=value11
key12=value12
key13=value13
key21=value21
key22=value22
key23=value23
文件2.2属性:
key11=value11
key12=value12
key13=value13
key21=value21
key22=value22
key23=value23
请注意,下面的代码未经优化。这是一个简单的“肮脏的”概念证明,展示如何解决你的任务
将以下类添加到项目中:
package folderapp;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URISyntaxException;
import java.util.Properties;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class FolderTestApp {
public static void main(String[] args) throws URISyntaxException, IOException {
new FolderTestApp();
}
public FolderTestApp() throws URISyntaxException, IOException {
// determining the running jar file location
String jarFilePath = getClass().getProtectionDomain().
getCodeSource().getLocation().toURI().getPath();
// note, that the starting / is removed
// because zip entries won't start with this symbol
String zipEntryFolder = "catalogos/";
try (ZipInputStream zipInputStream
= new ZipInputStream(new FileInputStream(jarFilePath))) {
ZipEntry zipEntry = zipInputStream.getNextEntry();
while (zipEntry != null) {
System.out.println("processing: " + zipEntry.getName());
if (zipEntry.getName().startsWith(zipEntryFolder)) {
// directory "catalogos" will appear as a zip-entry
// and we're checking this condition
if (!zipEntry.isDirectory()) {
// adding symbol / because it is required for getResourceAsStream() call
printProperties("/" + zipEntry.getName());
}
}
zipEntry = zipInputStream.getNextEntry();
}
}
}
public void printProperties(String path) throws IOException {
try (InputStream is = getClass().getResourceAsStream(path)) {
InputStreamReader fr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(fr);
Properties properties = new Properties();
properties.load(br);
System.out.println("contents from: " + path + "\n");
Set<Object> keySet = properties.keySet();
for (Object key : keySet) {
System.out.println(key + " = " + properties.get(key));
}
System.out.println("---------------------------------------");
}
}
}
package folderapp;
导入java.io.BufferedReader;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.net.URISyntaxException;
导入java.util.Properties;
导入java.util.Set;
导入java.util.zip.ZipEntry;
导入java.util.zip.ZipInputStream;
公共类FolderTestApp{
公共静态void main(字符串[]args)抛出URISyntaxException、IOException{
新FolderTestApp();
}
public FolderTestApp()引发URI语法异常,IOException{
//确定正在运行的jar文件位置
字符串jarFilePath=getClass().getProtectionDomain()。
getCodeSource().getLocation().Tori().getPath();
//请注意,启动/关闭开关已拆下
//因为zip条目不会以此符号开头
字符串zipEntryFolder=“catalogos/”;
试试(ZipInputStream)ZipInputStream
=新的ZipInputStream(新的FileInputStream(jarFilePath))){
ZipEntry-ZipEntry=zipInputStream.getNextEntry();
while(zipEntry!=null){
System.out.println(“处理:+zipEntry.getName());
if(zipEntry.getName().startsWith(zipEntryFolder)){
//目录“catalogos”将显示为zip条目
//我们正在检查这个情况
如果(!zipEntry.isDirectory()){
//添加符号/因为getResourceAsStream()调用需要它
printProperties(“/”+zipEntry.getName());
}
}
zipEntry=zipInputStream.getnextery();
}
}
}
公共void printProperties(字符串路径)引发IOException{
try(InputStream=getClass().getResourceAsStream(路径)){
InputStreamReader fr=新的InputStreamReader(is);
BufferedReader br=新的BufferedReader(fr);
属性=新属性();
属性。加载(br);
System.out.println(“内容来自:“+path+”\n”);
Set keySet=properties.keySet();
用于(对象键:键集){
System.out.println(key+“=”+properties.get(key));
}
System.out.println(“---------------------------------------------------”;
}
}
}
将该类设置为项目设置中的主类(Run
section)
并通过菜单构建您的项目:Run-build
构建项目后,打开生成的jar所在的FolderTestApp/dist
文件夹并运行以下jar文件:
就是这样:)您可以使用任何处理zip文件的程序打开jar文件,并检查其内容以查看文件夹structure@cricket_007它有所有的文件夹,包括我想要的那个。在我的项目中,文件夹位于src/内,在jar中,它位于/上,您可能需要在资源路径上使用前导斜杠,then@cricket_007没有。如果我使用
/catalogos/
,它会抛出一个空指针。之前的错误是什么?找不到文件?您的解决方案有效,我根据您的解决方案创建了一个代码,但我将等待其他更有效的答案。文件夹中的文件数量可能会增加,扫描罐子中的每个文件并不好。@GoldenMedal据我所知,对于标准类来说,除了一个接一个地处理ZipEntries之外,没有其他方法。无法获取属于特定文件夹的ZipEntries。此外,ZipEntries不是文件,它们是头和对zip条目的迭代。您不是在文件上迭代,而是在文件头记录上迭代。它们非常小,不需要花费明显的时间来处理。与其假设.jar是一个物理文件,您只需将getLocation()的值保留为URL,然后使用new-ZipInputStream(location.openStream())
。这使代码能够在分布式环境中工作,如Web Start和小程序。还有,它应该