Java 我的工作目录、文件和URL

Java 我的工作目录、文件和URL,java,toolkit,working-directory,Java,Toolkit,Working Directory,围绕我的数据文件所在的位置,我有各种各样的需求。当前应用程序的所有类和数据文件都位于一个JAR中(使用EclipseIDE构建) 我注意到人们获取这些信息的方式似乎多种多样。我需要图像文件所在的路径(图形)。我还需要它作为URL来使用工具箱调用 Toolkit tk = frame.getToolkit(); image = tk.getImage(url.toFile()); 但是我在创建URL或其他方面遇到了麻烦。我试过几种不同的方法。此时,我将数据文件保存在文件系统中类文件的旁边。我正在

围绕我的数据文件所在的位置,我有各种各样的需求。当前应用程序的所有类和数据文件都位于一个JAR中(使用EclipseIDE构建)

我注意到人们获取这些信息的方式似乎多种多样。我需要图像文件所在的路径(图形)。我还需要它作为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扑克牌和一些按钮图像)任何帮助或建议都将不胜感激

蒂亚,
Mark

我根本不用使用URL,这是从使用粘贴代码开始的。当从类文件运行与从JAR文件运行时,URL的行为发生了变化,一切都发生了变化。因此,我这里的代码显示了我最终所做的一些事情,以及对发生的事情的注释(类文件或jar文件),并且我还得到了调试时间的调整(从最后剪掉bin/的部分)

上图:从init()时间开始。下面是一个getImage()函数,包括额外的调试相关行。注意:url.getFile()不能直接工作有两个原因-一个是它在jar之外时有文件:/1,另一个原因是它不会在其预先声明的根/下获取完整的pathspec

    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;
}
静态公共映像getImage(目录d,字符串文件名){ 图像=空; 字符串s=d.toString()+文件名; /* //注意:此url调用以/required开头(不带完整路径sepc) URL URL=parentFrame.getClass().getResource(“/”+s); 如果(url==null){ 跟踪(s+“-空url”); 返回null; } */ String file=rootDataPath+s;//url.getFile(); //尾注 字符串t=s=“getImage(“+file+”); Toolkit tk=parentFrame.getToolkit(); if(tk==null) s=s+“空tk”; 否则{ 试一试{ //这里需要完整的路径规范 //从.jar文件运行时,url.getFile()返回file: //但在从.class文件运行时不会这样做(所以不要使用它) s=t=“getImage(“+file+”); image=tk.getImage(文件);//url.getFile()); MediaTracker媒体=新的MediaTracker(父帧); 媒体添加图像(图像,0); 试一试{ media.waitForID(0); }捕捉(中断异常e){ s=s+e.getMessage(); } if(image==null){ //image=null; s=s+“空图像”; }else if(image.getHeight(parentFrame)<1){ s=s+“高度无效”; } }捕获(安全异常e){ s=s+e.getMessage(); } } 如果(!s等于(t)){ s=“file=”+file+“\n”+s; s=“rootDataPath=“+rootDataPath+”\n“+s; messageBox(父框架,“getImage()”,s); } 返回图像; } 不要使用
Toolkit
加载图像,因为Java 1.4。改为使用
ImageIO.read(String/File/URL)
,这是一种阻止方法,可确保在返回之前加载整个图像

image = tk.getImage(url.toString());
这是一个实际的问题。一旦有了
URL
(或
文件
)对象,不要将其扔掉并使用
字符串
表示法。更重要的是,不要提供本应表示
文件
字符串
,而是实际表示
URL


我没有读剩下的乱七八糟的代码片段(在问题或后续的“答案”中),你可能会在将来发布一篇文章。

好吧,我知道我可以这么说。返回URL的getClass().getResource(String)调用给了我一个问题。我正在调试,它将类文件放在一个名为“bin”的子目录中。但我在另一个叫做gfx的子目录中查找图像文件。因此,我看到getResource(“gfx/s.png”)不起作用。getResource(“/gfx/s.png”)确实有效。它使用前导斜杠。我无法让它使用以驱动器号开头的valir路径名,这是从init()中、从class.getProtectionDomain().getCodeSource().getLocation().getPath()返回的;似乎您的IDE有问题。无论图像位于何处,都应将其添加到类路径中,getResource()将正常工作。“无论图像位于何处,都应将其添加到类路径中,getResource()将正常工作”------您对所有资源子目录都这样做吗?为了使用类加载器查找资源,它必须位于类路径上,所以是的-您可以添加它们,或者只是将它们打包在与生成的类相同的目录/jar中(源仍然可以驻留在单独的树中)。关于前导斜杠-getResources()从类中查找相对于类包的内容,因此如果需要指定绝对路径,则需要使用前导斜杠。类加载器中的getResources()需要绝对路径,在这种情况下不能指定前导斜杠(这是一个糟糕的API)
Toolkit tk = frame.getToolkit();
image = tk.getImage(url.toString());