Мой рабочий каталог, файлы и URL - PullRequest
2 голосов
/ 20 августа 2011

У меня сближение потребностей, связанных с тем, где находятся мои файлы данных.В текущем приложении все файлы классов и данных в JAR (сборка с использованием Eclipse IDE).

Я заметил, что существует множество способов получения этой информации людьми.Мне нужен путь, где мои файлы изображений (графика).Мне также нужно это как URL, чтобы использовать вызов инструментария.

Toolkit tk = frame.getToolkit();
image = tk.getImage(url.toFile());

Но у меня проблемы с созданием URL-адреса или чего-то еще.Я пробовал несколько разных методов.На этом этапе я храню файлы данных рядом с файлами классов в файловой системе.Я добавляю еще одну функцию к тому, что я делаю - убираю каталог / bin при запуске в режиме отладки.

// in class BwServices at init:
try {
    rootDataPath = BwServices.class.getProtectionDomain()
        .getCodeSource().getLocation().getPath();
    rootDataPath = URLDecoder.decode(rootDataPath, "UTF-8");
        fileSystemAccess = true;
} 
if(rootDataPath.endsWith("/bin/"))  
    rootDataPath = rootDataPath.substring(0, rootDataPath.length() - 4);

Позже ... Я иду, чтобы получить изображения, и некоторые звонки не работают, я не знаю, почему

Я попробовал две вещи ...

// 1
String s = "file://" + rootDataPath + d.toString() + fileName;   
url = frame.getClass().getResource(s);

// 2
    try {
        url = new URL(s);
    } catch (MalformedURLException e) {
        trace("getImage - can't get url: " + s);
        e.printStackTrace();
    } 

У любого из них есть проблемы.
Мне звонят, чтобы получать изображения из разных мест.'Frame' - это родительский фрейм во всем исполнении в классе BwFrame.

Мой путь выглядит таким образом при любых попытках ...

rootDataPath: / C: / Users / Markgm / Documents / DEV / workspace / bwp /

Итак,Я ищу способы открыть FileInputStream или URL-адреса для инструментария, для файлов относительно того, где находится файл класса (и с некоторыми хитростями, когда в отладке).Для клиентского приложения это то, что есть.Когда-нибудь я, возможно, захочу запустить это как апплет, но я не знаю, где должны быть файлы изображений.(Игральные карты 50x75 и несколько изображений кнопок) Любая помощь или совет приветствуются!

TIA, Mark

Ответы [ 2 ]

1 голос
/ 20 августа 2011
Toolkit tk = frame.getToolkit();

Не используйте Toolkit для загрузки изображений, начиная с Java 1.4.Вместо этого используйте ImageIO.read(String/File/URL), который является методом блокировки, который обеспечивает загрузку всего изображения перед возвратом.

image = tk.getImage(url.toString());

И существует актуальная проблема.Если у вас есть объект URL (или File), не выбрасывайте его и используйте представление String.Что еще более важно, не предоставляйте String, который должен представлять File, но фактически представляет URL!

Я не читал остальную часть этого беспорядка фрагментов кода (в вопросе или последующем ответе) вы можете опубликовать SSCCE в будущем.

0 голосов
/ 20 августа 2011

Я вообще избавился от использования URL, что началось с использования вставленного кода. Поведение URL-адресов изменилось, как и все, при запуске из файла класса по сравнению с запуском из файла JAR. Итак, у меня есть код, который показывает кое-что из того, что я в итоге сделал, и комментарии к тому, что происходит (файл класса или файл jar), и я также получил корректировку на время отладки для работы (отрыв бина / с конца).

        // root path - starts with jar file or pathspec
    try {
        rootDataPath = BwServices.class.getProtectionDomain()
                    .getCodeSource().getLocation().getPath();
        rootDataPath = URLDecoder.decode(rootDataPath, "UTF-8");
        if(rootDataPath.endsWith("BwPlayer.jar"))
            rootDataPath = rootDataPath.substring(0, rootDataPath.length() - 12);
        fileSystemAccess = true;
    } catch(SecurityException e) {
        trace("No file system access: " + e.getMessage());
        messageBox(frame, "BwServices", "Cannot access file system");
        rootDataPath = "";
    } catch (UnsupportedEncodingException e) {
        trace("Jar URL decode exception: "+ e.getMessage());
    } 
    if(rootDataPath.endsWith("/bin/"))  // remove bin/ portion if in debug
        rootDataPath = rootDataPath.substring(0, rootDataPath.length() - 4);
    trace("rootDataPath: "+rootDataPath);

Вверху: от времени init (). Ниже приведена функция getImage (), включая дополнительные строки, связанные с отладкой. Примечание: url.getFile () не работает напрямую по двум причинам - одна из них имеет файл: / когда находится вне фляги, а другая, потому что он не будет принимать полную спецификацию пути под предварительно заданным корнем /.

    static public Image getImage(Directory d, String fileName) {
    Image image = null;
    String s = d.toString() + fileName;
    /*
    // Note: Start with / required for this url call (w/o full pathsepc)
    URL url = parentFrame.getClass().getResource("/" + s);
    if(url == null) {
         trace(s + " - null url ");
         return null;
    }
    */
    String file = rootDataPath + s; // url.getFile();
    // end note
    String t = s = "getImage(" + file + ") ";

    Toolkit tk = parentFrame.getToolkit();
    if(tk == null)
        s = s + "NULL tk ";
    else {
        try {
            // full pathspec needed here 
            // url.getFile() returns with file:/ when running from the .jar file
            //  but not when running from .class file (so don't use it)
            s = t = "getImage(" + file + ") ";
            image = tk.getImage(file); //url.getFile());
            MediaTracker media = new MediaTracker(parentFrame);
            media.addImage(image, 0);
            try {
                media.waitForID(0);
            } catch(InterruptedException e) {
                s = s + e.getMessage();
            }       
            if(image == null) {
                // image = null;
                s = s + "NULL image ";
            } else if(image.getHeight(parentFrame) < 1) {
                s = s + "invalid height";
            }
        } catch (SecurityException e) {
            s = s + e.getMessage();
        }
    } 

    if(! s.equals(t)) {
        s = "file=" + file + "\n" + s;
        s = "rootDataPath=" + rootDataPath + "\n" + s;
        messageBox(parentFrame, "getImage()", s);
    }
    return image;
}
...