Non ho lavorato con java a lungo, quindi non sono sicuro di cosa altro cercare. Spero che qualcuno possa indicarmi la giusta direzione.Recupero di risorse per una classe di sottopackage
Obiettivo: Desidero utilizzare una tabella di ricerca, memorizzata come file di testo. Ma non voglio usare percorsi assoluti, dato che alla fine mi piacerebbe mettere in valigia una release ed essere in grado di chiamarla da qualsiasi posizione (il file di testo sarà incluso nella versione compresso).
configurazione attuale: ho messo il file di testo in una cartella denominata "risorse" (perché dalla lettura tutorial su Java, ho avuto l'impressione, questo è dove dovrei metterlo a mantenere una migliore strutturata progetto).
Nella cartella del pacchetto radice ho una classe (MainClass.java) che chiama un'altra classe (LookUpClass.java) in un sotto pacchetto. L'impostazione della cartella è come segue:
- src
- java
- main.package.com
- subpackage
- LookUpClass.java
- PlotterClass.java
- MainClass.java
- subpackage
- main.package.com
- risorse
- lookuptables
- LookUpTable1.txt
- LookUpTable2.txt
- lookuptables
- java
Ho scritto un metodo in LookUpClass.java
che recupera una determinata riga dalle mie tabelle di ricerca in risorse. Per recuperare il file e leggere una certa linea, ho usato
// Gets respective line from LUT
private static String getLineFromLUT(int line) {
URL url = LookUpClass.class.getClass().getResource("/LookUpTables/LookUpTable1.txt");
File file = new File(url.toURI());
BufferedReader br = new BufferedReader(new FileReader(file));
for (int i = 0; i < line; ++i)
br.readLine();
return br.readLine;
}
Nella mia struttura del progetto la cartella "Java" è contrassegnato come "fonte", mentre "risorse" è contrassegnato come, pure, "risorse".
La mia configurazione di prova è molto semplice:
public static void main(String[] args) throws URISyntaxException, IOException {
String c = LookUpClass.getLineFromLUT(5);
System.out.println("Color of line 5: " + c);
}
uscita:
Color of line 5: 0 0 38
(che è corretto.)
ho aggiunto le stesse linee esatte per PlotterClass.java
e funziona bene, anche.
Problema:
Ora, Se provo lo stesso in MainClass.java
ottengo un errore con url
essendo nullo. Sembra che la cartella risorse/risorse non possa essere trovata.
ho letto attraverso vari messaggi su SO e già provato fuori diverse soluzioni proposte, che tutti falliti finora:
- Se utilizza
LookUpClass.class.getClassLoader().getResource("/LookUpTables/LookUpTable1.txt")
entrambe chiamate daMainClass.java
eLookUpClass.java
sicuro (url
è nullo). - Ho provato utilizzando seguenti percorsi (tutti non funziona in una delle classi): "lookuptables/LookUpTable1.txt" (rimozione di partenza "/") "/subpackage/LookUpTables/LookUpTable1.txt" " ../ subpackage/LookUpTables/LookUpTable1.txt "
- Da quando ho usato Idea IntelliJ, ho controllato" Impostazioni> Costruisci, Esecuzione, Distribuzione> Compendio> Schemi di risorse "e aggiunto" * .txt "ai modelli. Niente è cambiato.
- Se si aggiunge
Class c = LookUpClass.class.getClass();
, in modalità Debug c è "class.java.lang.Class". Mi aspettavo qualcosa come "main.package.com.subpackage.LookUpClass". - A un certo punto ho provato a utilizzare
getResourceAsStream()
, ma non ho capito come ottenere la mia (ad esempio) quinta linea, quindi l'ho scartata. Sono disposto a leggere su questo, se risolve il mio problema però.
Non ho idea di come risolvere questo problema. E mi rendo conto che a questo punto sto solo provando le cose, senza nemmeno capire perché potrebbe o non potrebbe funzionare. Per me, sembra che LookUpClass.java
venga eseguito da una posizione diversa da MainClass.java
. Ma la cartella "risorse" e la rispettiva posizione del file di testo non cambiano mai. Come si può trovare il file in un caso, ma non nell'altro?
Tre ulteriori domande: Stai utilizzando un IDE (come Eclipse)? Stai usando uno strumento di costruzione (come Maven)? I tuoi file di testo devono essere aggiornati dall'utente o fanno parte della distribuzione? – Seelenvirtuose
si può cercare di garantire l'oggetto di classe che si sta utilizzando per ottenere il caricatore di classe dalla realtà è caricata ad esempio 'try { \t \t \t \t \t Class.forName (MainClass.class.getName()); \t \t \t \t} catch (finale ClassNotFoundException ex) { \t \t \t \t} ' – muued
@Seelenvirtuose Sì per entrambi: sto usando IntelliJ e il progetto è infatti costruito con Maven. I file di testo devono essere statici e parte della distribuzione. Contengono i codici RGB per una mappa di calore. – fukiburi