GoldenMedal
GoldenMedal

Reputation: 102

getting resources inside a built application

i want to get files inside a folder when my application is running, so i know that i need to get it as resouce, if i will get it as file, it wont work, so it what i did.

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);
                    }
                }

What i want to do is, get all files inside a folder (/catalogos/) and loop through and unmarshall each to an object so i will be able to access the property i need. So, when i run this with netbeans, works perfectly, but when i build and run the jar, i dont get the same result i've got using netbeans, i mean, the data is not where i expected.

Upvotes: 1

Views: 80

Answers (1)

user784540
user784540

Reputation:

The following example demonstrates how to get files from a directory in current runnable jar file and read these files contents.

Assume you have a NetBeans project with name "FolderTestApp". Do the following steps:

  1. In your project root folder FolderTestApp\ create folder myFiles.
  2. Copy your catalogos folder to the FolderTestApp\myFiles\

files in the project structure

myFiles folder is necessary to preserve catalogos folder in your jar file structure when project jar is being generated. myFiles folder will disappear from jar file, but catalogos folder will remain.

catalogos folder in generated jar file

If you don't do these steps, and place catalogos directly to the project folder (not as a child folder for myFiles), then your files from catalogos folder will be placed to the root of your jar file.

  1. Add myFiles folder as a source folder in netbeans project properties.

adding folder to the source folders list

Assume your property files contain the following contents:

file1.properties:

key11=value11
key12=value12
key13=value13

file2.properties:

key21=value21
key22=value22
key23=value23

Please note, that code below is not optimized. It is plain'n'dirty proof of concept to show, how to solve your task.

Add the following class to your project:

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("---------------------------------------");
        }
    }

}

Set this class as the main class in your project settings (Run section).

main class setup

And build your project via menu: Run - Build.

As your project has been built, open FolderTestApp/dist folder, where your generated jar is located and run this jar file:

running the generated jar file

That's it :)

Upvotes: 2

Related Questions