getResourceAsStream returnează null

Am'm încărcați un fișier text dintr-un pachet compilate într-un BORCAN meu proiect Java. Relevante structura de directoare este după cum urmează:

/src/initialization/Lifepaths.txt

Codul folosit pentru a încărca fișierul este:

public class Lifepaths {
    public static void execute() {
        System.out.println(Lifepaths.class.getClass().
            getResourceAsStream("/initialization/Lifepaths.txt"));
    }

    private Lifepaths() {}

    //This is temporary; will eventually be called from outside
    public static void main(String[] args) {execute();}
}

Imprimare va imprima întotdeauna null, indiferent de ceea ce am folosi. Am'm nu sunt sigur de ce cele de mai sus ar't de lucru, așa că m-am'am încercat, de asemenea,:

  • "/src/inițializare/Lifepaths.txt"
  • "inițializare/Lifepaths.txt"
  • "Lifepaths.txt"

Nici unul dintre aceste muncă. I've citește numeroase intrebari până în prezent pe acest subiect, dar nici unul dintre ei au fost de ajutor - de obicei, ei spun doar pentru a încărca fișiere folosind calea rădăcină, pe care am'm deja o fac. Asta, sau doar încărcați fișierul din directorul curent (doar încărcare filename), pe care am'am încercat, de asemenea,. Dosarul este întocmit în BORCAN în locația corespunzătoare cu numele corespunzător.

Cum pot rezolva acest lucru?

Comentarii la întrebare (8)
Soluția

Lifepaths.clasa.getClass().getResourceAsStream(...) sarcini folosind resurse de sistem încărcător de clasă, evident, nu pentru că nu-ți vezi Borcane

Lifepaths.clasa.getResourceAsStream(...) mulțime de resurse, folosind același încărcător de clase care încărcate Lifepaths clasă și că ar trebui să aibă acces la resurse în Borcane

Comentarii (6)

Regulile sunt după cum urmează:

  1. verificați locația fișierului pe care doriți să încărcați în interiorul BORCAN (și, prin urmare, de asemenea, asigurați-vă că, de fapt, adăugat la BORCAN)
  2. utilizați fie o cale absolută: calea începe la rădăcina BORCAN
  3. utiliza o cale relativă: calea începe la pachet director de clasa're de asteptare getResource/ getResoucreAsStream

Și să încerce:

Lifepaths.class.getResourceAsStream("/initialization/Lifepaths.txt")

în loc de

Lifepaths.class.getClass().getResourceAsStream("/initialization/Lifepaths.txt")

(nu sunt sigur dacă se face o diferență, dar primul va folosi corect Agent/ BORCAN, în timp ce eu'm nu sunt sigur cu acesta din urmă)

Comentarii (3)

Deci, există mai multe modalități de a obține o resursă dintr-un borcan și fiecare are ușor diferite de sintaxă în cazul în care calea trebuie să fie specificat în mod diferit.

Cea mai bună explicație pe care am văzut acest articol din JavaWorld. Am'll rezuma aici, dar dacă vrei să știi mai multe, ar trebui să verificați art.

Metode

  1. Agent.getResourceAsStream().

Format: "/"-separate de nume; nu de conducere "/" (toate numele sunt absolut).

Exemplu: acest lucru.getClass().getClassLoader().getResourceAsStream("unii/pkg/resurse.proprietăți");

  1. Clasă.getResourceAsStream()

Format: "/"-separate de nume; de conducere "/" indică absolută nume; toate celelalte nume sunt relative la clasa's pachetului

Exemplu: acest lucru.getClass().getResourceAsStream("/unii/pkg/resurse.proprietăți");

Comentarii (3)

Don't folosi căi absolute, le face relativ la 'resurse' director în proiectul dumneavoastră. Rapid și murdar de cod care afișează conținutul MyTest.txt din directorul 'resurse'.

@Test
public void testDefaultResource() {
    // can we see default resources
    BufferedInputStream result = (BufferedInputStream) 
         Config.class.getClassLoader().getResourceAsStream("MyTest.txt");
    byte [] b = new byte[256];
    int val = 0;
    String txt = null;
    do {
        try {
            val = result.read(b);
            if (val > 0) {
                txt += new String(b, 0, val);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } 
    } while (val > -1);
    System.out.println(txt);
}
Comentarii (0)

S-ar putea să doriți să încercați acest lucru pentru a obține curentul i.e primul obține url-ul și apoi deschideți-l ca flux.

URL url = getClass().getResource("/initialization/Lifepaths.txt"); 
InputStream strm = url.openStream(); 

Am avut odată o întrebare similară: https://stackoverflow.com/questions/16563622/reading-txt-file-from-jar-fails-but-reading-image-works/16564611#16564611

Comentarii (1)

Acolo pare a fi problema cu Agent pe care îl utilizați. Utilizați contextClassLoader la clasa de încărcare. Acest lucru este, indiferent dacă acesta este într-o static/non-static method

Fir.currentThread().getContextClassLoader().getResourceAsStream......

Comentarii (0)

M-am trezit într-o problemă similară. Din moment ce eu sunt, folosind maven am nevoie pentru a actualiza mea pom.xml pentru a include ceva de genul asta:

   ...




            /src/main/resources


            ../src/main/resources



        ...

Notă resurse tag-ul acolo pentru a specifica în cazul în care dosarul este. Dacă aveți imbricate proiecte (cum fac eu), atunci ați putea dori pentru a obține resurse din alte zone, în loc doar în modul în care lucrați. Acest lucru ajută la reducerea păstrând același fișier în fiecare repo dacă utilizați similare config date

Comentarii (0)

Asigurați-vă că directorul de resurse (de exemplu, "src") este în classpath (asigurați-vă că-l's o sursă de director în a construi calea în eclipse).

Asigurați-vă că clazz este încărcat de principal agent.

Apoi, pentru a încărca src/initialization/Lifepaths.txt, utilizare

clazz.getResourceAsStream("/initialization/Lifepaths.txt");

De ce: clazz.getResourcesAsStream(foo) se uită în sus de la foo în clase de clazz, relativă la directorul clazz locuiește în. Lider "/" face sarcina de rădăcină de orice director în clase de clazz.

Dacă nu're într-un recipient de un fel, cum ar fi Tomcat, sau fac ceva cu ClassLoaders direct, poți să-ți tratezi eclipse/linie de comandă classpath ca singurul agent classpath.

Comentarii (0)

Don'nu stiu daca ajuta, dar in cazul meu am avut de resurse în /src/ folder și a fost obtinerea această eroare. Apoi m-am mutat poza la folderul bin si sa rezolvat problema.

Comentarii (0)

Aproximativ vorbind:

getClass().getResource("/") ~= Ață.currentThread().getContextClassLoader().getResource(".")

Să presupunem că structura proiectului este de genul următor:

`` ă── src │   ├── principalele │   └── test │ └── testare │ ă── java │ │   └── com │ │   └── github │ │   └── xyz │ │   └── proj │ │   ├── MainTest.java │ │   └── TestBase.java │ └── resurselor │ └── abcd.txt └── țintă └── test-clase ă── com └── abcd.txt

``

`` // în MainClass.java acest lucru.getClass.getResource("/") -> "~/proj_dir/țintă/test-clase/" acest lucru.getClass.getResource(".") -> "~/proj_dir/țintă/test-clase/com/github/xyz/proj/" Fir.currentThread().getContextClassLoader().getResources(".") -> "~/proj_dir/țintă/test-clase/" Fir.currentThread().getContextClassLoader().getResources("/") -> nul

``

Comentarii (0)

dacă sunteți folosind Maven asigurați-vă că ambalajul este 'borcan' nu 'pom'.

jar
Comentarii (0)

Ceea ce a funcționat pentru mine a fost să adăugați fișierul în Proiectul Meu/Resurse Java/src și de a folosi apoi

this.getClass().getClassLoader().getResourceAsStream(myfile.txt);

Am't nevoie pentru a explicit a adăuga acest fișier de pe calea (adăugându-l la /src asta aparent)

Comentarii (1)

Implicit JVM classloader va folosi părinte-agent pentru a încărca resursele prima: .

Lifepaths.clasa.getClass()'s agent este bootstrap agent, decigetResourceAsStreamva căuta $JAVA_HOME numai, indiferent de utilizator furnizatclase`. Evident, Lifepaths.txt nu este acolo.

Lifepaths.class 's agent este sistem classpath agent, deci getResourceAsStream va de căutare definite de utilizator clase și Lifepaths.txt este acolo.

Atunci când se utilizează java.lang.Clasa#getResourceAsStream(String nume), nume care nu este de a începe cu **'/'** vor fi adăugate cu pachetul nume ca prefix. Dacă doriți evita acest lucru, vă rugăm să utilizați java.lang.Agent#getResourceAsStream`. De exemplu: Java ClassLoader loader = Fir.currentThread().getContextClassLoader(); String resourceName = "Lifepaths.txt"; InputStream resourceStream = loader.getResourceAsStream(resourceName);

Comentarii (0)

@Emracool... am'd sugera o alternativă. Din moment ce par a fi încercarea de a încărca o *.fișier txt. Mai bine să utilizați FileInputStream (), mai degrabă, atunci acest lucru enervant getClass().getClassLoader().getResourceAsStream () " sau " getClass().getResourceAsStream()`. Cel puțin codul se va executa în mod corespunzător.

Comentarii (2)