2011-08-20 2 views
2

J'ai une convergence de besoins tournant autour de l'emplacement de mes fichiers de données. L'application actuelle contient tous les fichiers de classe et de données dans un fichier JAR (création d'un EDI Eclipse).Mon répertoire de travail, mes fichiers et mes urls

J'ai remarqué qu'il y a plusieurs façons dont les gens obtiennent cette information. J'ai besoin du chemin pour où mes fichiers d'image sont (graphiques). J'en ai également besoin comme URL pour utiliser l'appel de la boîte à outils.

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

Mais j'ai des problèmes avec la création de l'URL ou quelque chose. J'ai essayé quelques méthodes différentes. À ce stade, je garde les fichiers de données à côté des fichiers de classe dans le système de fichiers. J'ajoute une autre fonction à ce que je fais - dépouiller le répertoire/bin lors de l'exécution dans le débogage.

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

Plus tard ... j'obtenir des images et des appels ne fonctionnent pas, je ne sais pas pourquoi

J'ai essayé deux choses ....

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

L'un ou l'autre a des problèmes.
J'ai des appels pour obtenir des images de différents endroits. Le 'frame' est le cadre parent tout au long de l'exécution, dans la classe BwFrame.

Mon chemin est comme ça dans toute tentative ...

rootDataPath:/C:/Users/Markgm/Documents/DEV/espace de travail/BWP/

Donc, je suis à la recherche des moyens pour ouvrir FileInputStream ou des URLs pour le toolkit, pour les fichiers relatifs à l'emplacement du fichier de classe (et avec un truc pour le déboguer). Pour une application côté client, c'est ce que c'est. Un jour, je pourrais vouloir exécuter ceci comme une applet, mais je ne sais pas où les fichiers d'image devront être. (50x75 cartes à jouer et quelques images de bouton) Toute aide ou conseil est apprécié!

TIA, Mark

+1

Eh bien, je sais que je peux le dire. L'appel getClass(). GetResource (String) qui renvoie une URL me pose un problème. Je suis en debug, ce qui place les fichiers de classe dans un sous-répertoire appelé 'bin'. Mais je vais après les fichiers image dans un autre sous-répertoire appelé gfx. Donc, je vois getResource ("gfx/s.png") ne fonctionne pas. getResource ("/ gfx/s.png") fonctionne. Cela fonctionne avec une barre oblique. Je ne peux pas l'obtenir pour travailler avec un nom de chemin valir commençant par la lettre de lecteur, comme renvoyé de in.init(), de class.getProtectionDomain() \t \t \t .getCodeSource(). GetLocation(). GetPath(); –

+1

On dirait que vous rencontrez des problèmes avec votre IDE. Indépendamment des sous-répertoires où se trouvent vos images, elles doivent être ajoutées à votre classpath et getResource() fonctionnera correctement. – ddimitrov

+0

"Indépendamment des sous-répertoires où vos images sont, ils devraient être ajoutés à votre classpath et getResource() fonctionnera bien" --------- Faites-vous cela avec tous vos sous-répertoires de ressources? –

Répondre

0

Je me suis débarrassé de l'utilisation des URL à tous, qui a commencé avec l'utilisation du code collé. Le comportement des URL a changé, tout comme tout, lors de l'exécution à partir d'un fichier de classe par rapport à un fichier JAR. J'ai donc du code ici qui montre ce que j'ai fini par faire, et commente ce qui se passe (fichier de classe ou fichier jar), et j'ai aussi le réglage pour que le débogage fonctionne (couper bin/de la fin).

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

Ci-dessus: depuis l'instant init(). Ci-dessous, une fonction getImage(), incluant des lignes supplémentaires liées au débogage. Note: url.getFile() ne fonctionne pas directement pour 2 raisons - l'une est le fichier:/quand il sort d'un pot, et l'autre parce qu'il ne prendra pas une pathspec complète sous sa racine pré-indiquée /.

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; 
} 
+0

Comme je l'ai commenté ailleurs, je n'avais pas vraiment fini de sortir les images du JAR, en raison de la présence d'images là aussi. Je l'ai fonctionné comme ci-dessus, mais où si faire une URL fonctionne en utilisant "/" en tant que root (plus le répertoire/jar in-jar), alors j'utilise l'URL, sinon j'utilise le nom du fichier. Cela fonctionne dans les deux sens (ou maintenant "toutes les manières"). –

1
Toolkit tk = frame.getToolkit(); 

Ne pas utiliser Toolkit pour charger des images, depuis Java 1.4. Utilisez plutôt ImageIO.read(String/File/URL), qui est une méthode de blocage qui garantit que l'image entière est chargée avant de revenir.

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

Et il y a un problème réel. Une fois que vous avez un objet URL (ou File), ne le jetez pas et utilisez la représentation String.Plus important encore, ne fournissez pas un String qui est censé représenter un File, mais représente en réalité un URL!

Je ne l'ai pas lu le reste de ce désordre des extraits de code (dans la question ou le suivi « réponse »), vous pouvez regarder pour poster un SSCCE à l'avenir.

+0

OK, eh bien, j'ai Toolkit fonctionnant, dans ma réponse-code ci-dessus, avec un pathspec complet. Ensuite, dans l'exemple du haut, c'était url.getFIle() et une faute de frappe dans le post (toString()) - ni travaillé. Je n'ai pas fait de SSCCE en raison du code impliqué, mais je voulais voir ce que quelqu'un dirait sur la façon dont ils accèdent aux fichiers dans/hors du fichier jar sur une application côté client. Mon envoi de réponse utilise également un MediaTracker pour attendre le chargement de l'image. Merci pour l'astuce à propos de ImageIO.read(), qui, je suppose, fonctionnerait avec mon nom de fichier rootDataPath + ci-dessus? –

+1

* "ce que je suppose pourrait fonctionner" * Arrêtez de deviner et lire les JavaDocs. –

+0

C'est ce que j'ai travaillé tout autour. Le fichier String a le chemin d'accès et le nom de fichier locaux complets ....... image = ImageIO.read (nouveau fichier (fichier)); Le pathsepc provient de rootDataPath, tel qu'il a été créé pendant init dans le code de ma réponse. –

Questions connexes