Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Strike

Frischling

  • »Strike« ist der Autor dieses Themas

Beiträge: 36

Wohnort: Wien 1200 und Techelsberg 9212

Beruf: Junior Software-Entwickler & Software Testing

  • Private Nachricht senden

1

15.04.2014, 21:45

Ressourcen in Java aus anderem Source-Folder laden

Guten Tag

Ich bin gerade dabei einwenig Java zu programmieren. Ich habe mir hierfür eine Methode aus einem Tutorial, welche ich gerne umschreiben möchte. Die Klasse in der diese Methode implementiert ist, ist hier abgebildet:

Quellcode

1
2
3
4
5
6
7
8
9
10
packagedefinition und imports;

public class BufferedImageLoader {
    
    public BufferedImage loadImage(String pathRelativeToThis) throws IOException {
        URL url = this.getClass().getResource(pathRelativeToThis);
        BufferedImage img = ImageIO.read(url);
        return img;
    }
}


Wie unschwer zu erkennen ist geben wir der Funktion hier einen String mit der einen relativen Pfad beinhalten soll, welcher uns zu einer Image-Resource führt.

Die Methode ist getestet und funktioniert einwandfrei.
Die Sache hat nur den einen Haken dass die Image-Resource in dem selben Package liegen muss (auch Unterordner) wie die implementierte Klasse "BufferedImageLoader".

Meine Frage ist folgende: Wie muss ich Code und/oder Eclipse-Einstellungen verändern damit ich die Image-Resource aus einem anderen SourceFolder laden kann.

Ordnerstruktur:

-- Projecthome_Folder
-- -- src (Source Folder für .java-Dateien)
-- -- -- spritesheet (package)
-- -- -- -- BufferedImageLoader (Java-Klasse)
-- -- res (Source Folder für alle möglichen Ressourcen)
-- -- -- images (gewöhnlicher Ordner)
-- -- -- -- example.png (erwünschte Datei)

Ich hoffe dass mir jemand helfen kann.

Mit freundlichen Grüßen aus Kärnten
Strike

Strike

Frischling

  • »Strike« ist der Autor dieses Themas

Beiträge: 36

Wohnort: Wien 1200 und Techelsberg 9212

Beruf: Junior Software-Entwickler & Software Testing

  • Private Nachricht senden

2

15.04.2014, 23:26

Die Ausgabe in der Java-Konsole lautet: /C:/Projects/JavaGameTest/GJGDTutorial/bin/spritesheet/

Laut Ordnerverzeichnis muss ich nach: C:\Projects\JavaGameTest\GJGDTutorial\bin\images\example.png (aus Windows kopiert)

Aber wie komm ich da hin?

Ist der relative Pfad vielleicht: ../images/example.png?

Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

3

16.04.2014, 11:23

Ich würde dir raten einfach maven einzusetzen.

http://maven.apache.org/


Maven erzeugt dir die Struktur deines Projektes und bietet auch noch einige andere tolle Dinge. Du könntest dann einfach deine Dateien in den resources Folder ablegen und direkt drauf zugreifen, da dieses Verzeichnis in deinem classpath eingehangen ist.


http://maven.apache.org/guides/introduct…ory-layout.html

4

17.04.2014, 12:54

Ressourcen, die Du über Class#getResource lädst, werden über den Klassenpfad aufgelöst. Du kannst bei Eclipse in den Projekteigenschaften weitere Quelltext- und Ressourcenordner dem Klassenpfad hinzufügen. Wenn Du über Class#getResource die Datei lädst kannst Du auch "/" voranstellen, um absolute Pfade im Klassenpfad zu suchen.

Du kannst auch Dateien, die nicht im Klassenpfad liegen, laden. Dann machst Du das am besten über new File(...). Das Arbeitsverzeichnis der Java-Anwendung erhältst Du über System.getProperty("user.dir"). Ich würde aber empfehlen, das ganze über den Klassenpfad zu lösen.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

17.04.2014, 13:49

Ich hab mir dafür einfach eine Klasse in das Package gepackt über das ich dann lade...
Guck mal hier (Loader.java).

Ich wette es geht schöner, aber wenn weiß ich nicht wie und finde es sowieso doof gelöst in Java...

Strike

Frischling

  • »Strike« ist der Autor dieses Themas

Beiträge: 36

Wohnort: Wien 1200 und Techelsberg 9212

Beruf: Junior Software-Entwickler & Software Testing

  • Private Nachricht senden

6

18.04.2014, 21:38

Vielen Dank für eure schnellen Antworten!

Mittlerweile klappt das Laden von Ressourcen.
Ich habe mich für die dritte Variante entschieden und eine eigene Klasse geschrieben.

Die Klasse "ResourceLoader.java" im Package "data" lädt Ressourcen durch absolute Pfade.
Doch damit das Programm nicht nur bei mir funktioniert habe ich die Technik von "LetsGo" angewandt um mir die Pfade zusammen zu bauen.

Da die bisherigen Test relativ flach ausfallten und die Klasse noch nicht besonders umfangreich ist würde es mir weiterhelfen
wenn der ein oder andere mir Bescheid gibt wo noch Verbesserungen möglich sind bzw. wo Fehler auftreten.

Damit die Klasse funktioniert braucht ihr ein .properties-file, welche folgende Information enthällt: Name des Pfads = Pfad

Beispiel:

Dashier:
URL resource = this.getClass().getResource("");
System.out.println(resource.getPath());
gibt folgenden Pfad: /C/.../bin/data/
letzten 5 Stellen werden entfernt!
also Appl-Verzeichnis: /C/.../bin/

Wollt ihr nun ein Bild laden braucht ihr folgenden properties-Eintrag:
image_folder=images/

Hier die Klasse:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package data;

import java.awt.Image;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Properties;
import java.util.Set;

import javax.imageio.ImageIO;

public class ResourceLoader {
    
    // Memberlist
    //
    public final String dataURL = this.getClass().getResource("").getPath();
    public final String appURL = dataURL.substring(0,dataURL.length()-5);
    private Properties loadingData = null;
    
    private volatile HashMap<String,EPath> mPaths = null;
    
    
    // Initialize Class
    //
    public ResourceLoader () {
        mPaths = new HashMap<String, EPath>();
        loadingProperties();
        fillPathMap();
    }
    private void loadingProperties() {
        loadingData = new Properties();
        InputStream input = null;
     
        try {
            input = new FileInputStream(dataURL + "loading.properties");
            loadingData.load(input);
        } catch (FileNotFoundException fnfe) {
            System.out.println("Error: file not found!");
            System.out.println("Message: "+fnfe.getMessage());
            fnfe.printStackTrace();
        } catch (IOException ioe) {
            System.out.println("Error: IO-Exception!");
            System.out.println("Message: "+ioe.getMessage());
            ioe.printStackTrace();
        }
    }
    private void fillPathMap () {
        Set<String> tmpKeys = loadingData.stringPropertyNames();
        for ( int i=0; i < tmpKeys.size(); i++ ) {
            String s = tmpKeys.toArray()[i].toString();
            mPaths.put( s, new EPath(appURL + loadingData.getProperty(s),true) );
        }
    }
    //
    // Initialize Class
    
    
    // Core-Business
    //
    public Image loadImage( String image ) {
        try {
        System.out.println( "Path: "+mPaths.get("image_path").toPath()+image );
        File file = new File( mPaths.get("image_path").toPath()+image );
        return ImageIO.read(file);
        } catch ( IOException ioe ) {
            System.out.println("Error: IOException");
            System.out.println("Message: " + ioe.getMessage());
            ioe.printStackTrace();
        }
        return null;
    }
    //
    // Core-Business
    
}

7

19.04.2014, 13:55

Du könntest Dir mal die Java7 File API anschauen.
Du kannst in den Klassenpfad auch Ordner/Pfade im Dateisystem packen. Dann hast Du die Flexibilität beim Entwickeln einfach in einen Ordner zu speichern und kannst am Ende ganz einfach auf Jar "umtsellen".

Strike

Frischling

  • »Strike« ist der Autor dieses Themas

Beiträge: 36

Wohnort: Wien 1200 und Techelsberg 9212

Beruf: Junior Software-Entwickler & Software Testing

  • Private Nachricht senden

8

20.04.2014, 23:51

Ein Thread greift vorerst darauf zu.
Aber das sollte es auch gewesen sein. :)

Das mit der Java 7 File API merk ich mir mal.
Danke für eure Hilfe

Funktioniert meine Variante nicht aus einer .JAR? ;(

9

21.04.2014, 20:11

Funktioniert meine Variante nicht aus einer .JAR?
Ich bin mir gerade nicht sicher, aber ich glaube der FileInputStream akzeptiert keine jar-URLs im Konstruktor. Ich beziehe mich da auf den Fall, dass die Dateien, die Du laden willst, im Jar liegen. Die Klassen können natürlich immer im Jar liegen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Chromanoid« (21.04.2014, 20:23)


Werbeanzeige