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项目属性中的源文件夹
  • 假设属性文件包含以下内容:

    file1.properties:

    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和小程序。还有,它应该