Прочитать каталог в jar-файле - PullRequest
0 голосов
/ 26 марта 2012

Я пытался заставить это работать весь день, но он всегда возвращается с ошибками, и даже после всех исследований, которые я провел, я все еще не понимаю

вот метод, строка, которая в настоящее время возвращается с ошибкой, является

File file = new File( url.toURI() );

Я не уверен, что мне нужно сделать, чтобы это заработало

public void preloadModelsTwo() {
    String slash = System.getProperty("file.separator");
    try {
        URL url = getClass().getResource("."+ slash +"Patches" + slash+"Models"+slash);
        File file = new File( url.toURI() );
        File[] fileArray = file.listFiles();
        for(int y = 0; y < fileArray.length; y++) {
            String s = fileArray[y].getName();
            if (s != "") {
                byte[] buffer = readFile("."+ slash +"Patches" + slash+"Models"+slash+""+s);
                Model.method460(buffer, Integer.parseInt(getFileNameWithoutExtension(s)));
                //System.out.println("Read model: " + s);
            }
        }
    } catch (Exception E) {
        System.out.println("error with secondary model screening");
        E.printStackTrace();
    }
}

все, что я знаю, - это то, что вещи нужно рассматривать как ресурсы, однако я не уверен, что мне нужно изменить, чтобы сделать это, я уверен, что я внес все необходимые изменения, однако это все еще не работает

любая помощь приветствуется

EDIT:

Я возился с этим, и это новый метод, который, кажется, работает довольно хорошо, за исключением того, что он не может читать

public String removeNonDigits(String text) {
    int length = text.length();
    StringBuffer buffer = new StringBuffer(length);
    for(int i = 0; i < length; i++) {
        char ch = text.charAt(i);
        if (Character.isDigit(ch)) {
            buffer.append(ch);
        }
    }
    return buffer.toString();
}

public JarEntry entry;
public void preloadModelsTwo() {
    String slash = System.getProperty("file.separator");
    try {
JarFile jarFile = new JarFile("SilabGarza.jar");
for(Enumeration em = jarFile.entries(); em.hasMoreElements();) {  
    String s= em.nextElement().toString();  
    if(s.contains(".dat")){
        entry = jarFile.getJarEntry(s);
        InputStream input = jarFile.getInputStream(entry);
        System.out.println("input = "+input);
        //byte[] buffer = readFile(s);
        String s2 = removeNonDigits(s);
        //Model.method460(buffer, Integer.parseInt(s2));
        System.out.println("Found: "+s);
        System.out.println("formd: "+s2);

        input.close();
    }  
}
jarFile.close();

    } catch (Exception E) {
        System.out.println("error with secondary model screening");
        E.printStackTrace();
    }
}

не уверен, как я должен это читать (сейчас я закомментировал чтение) кто-нибудь подсказки?

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

Вы неправильно используете File.separator здесь.Ресурс идентифицируется по URL-адресу, а не по имени файла, и URL-адреса имеют только косую черту.

В этом случае вы не правы, превращая этот URL-адрес в файл.Это может быть URL, который указывает внутри JAR в удаленном месте.

0 голосов
/ 26 марта 2012

Вы можете попробовать следующий код:

URL url = getClass().getResource(/* resource name */);
final URL resolve = org.eclipse.core.runtime.FileLocator.resolve(url);
File file = new File( resolve.getPath());

РЕДАКТИРОВАТЬ: О, я только что видел, вы получаете url как null.Помните, что getResource("resource name") ищет ресурс в classpath.Таким образом, ваш resource name должен быть /package/path/of/resourceName.extenstion

например /com/kjain/widget/identifier/views/view.jpg

...