getResourceAsStream zwraca null

Ładuję plik tekstowy z pakietu w skompilowanym JAR mojego projektu Java. Odpowiednia struktura katalogów jest następująca:

/src/initialization/Lifepaths.txt

Kod używany do załadowania pliku to:

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

Wydruk zawsze wydrukuje null, bez względu na to, czego używam. Nie jestem pewien, dlaczego powyższe nie miałoby działać, więc też próbowałem:

  • "/src/initialization/Lifepaths.txt"
  • "initialization/Lifepaths.txt"
  • "Lifepaths.txt"
Żadne z nich nie działa. I ' ve Czytaj liczne pytania do tej pory na ten temat, ale żadne z nich nie były pomocne - zazwyczaj mówią po prostu, aby załadować pliki za pomocą ścieżki głównej, co już robię. To, lub po prostu załaduj plik z bieżącego katalogu (po prostu załaduj filename), który również próbowałem. Plik jest kompilowany do JAR w odpowiednim miejscu o odpowiedniej nazwie. Jak mam to rozwiązać?
Author: Community, 2013-05-15

12 answers

Lifepaths.class.getClass().getResourceAsStream(...) ładuje zasoby za pomocą klasy systemowej loader, oczywiście zawodzi, ponieważ nie widzi Twoich jarów

Lifepaths.class.getResourceAsStream(...) ładuje zasoby używając tej samej klasy loader, która załadowała klasę Lifepaths i powinien mieć dostęp do zasobów w Twoich słoikach

 113
Author: hoaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-15 17:06:24

Zasady są następujące:

  1. Sprawdź lokalizację pliku, który chcesz załadować wewnątrz JAR (a tym samym upewnij się, że rzeczywiście dodany do JAR)
  2. użyj ścieżki absolutnej: ścieżka zaczyna się od korzenia słoika
  3. użyj względnej Ścieżki: Ścieżka zaczyna się w katalogu pakietu klasy, którą wywołujesz getResource / getResoucreAsStream

I spróbuj:

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

Zamiast

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

(Nie wiem, czy to robi różnicę, ale pierwszy użyje poprawnego Classloadera / JAR, podczas gdy nie jestem pewien z tym ostatnim)

 45
Author: Puce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-15 17:03:00

Istnieje kilka sposobów na uzyskanie zasobu z jar i każdy z nich ma nieco inną składnię, w której ścieżka musi być określona inaczej.

Najlepsze wyjaśnienie, jakie widziałem, to artykuł z JavaWorld . Podsumuję tutaj, ale jeśli chcesz wiedzieć więcej, powinieneś zajrzeć do artykułu.

Metody

1) ClassLoader.getResourceAsStream().

Format: "/ "- nazwy rozdzielone; bez wiodącego " / " (wszystkie nazwy są bezwzględne).

Przykład: this.getClass().getClassLoader().getResourceAsStream("some/pkg/resource.properties");

2) Class.getResourceAsStream()

Format: "/ "- nazwy rozdzielone; wiodący znak " / " wskazuje nazwy bezwzględne; wszystkie inne nazwy są względne do pakietu klasy

Przykład: this.getClass().getResourceAsStream("/some/pkg/resource.properties");

 33
Author: greedybuddha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-12 12:29:11

Nie używaj ścieżek bezwzględnych, ustaw je względem katalogu 'resources' w Twoim projekcie. Szybki i brudny kod, który wyświetla zawartość MyTest.txt z katalogu 'zasoby'.

@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);
}
 12
Author: Paul Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-16 15:58:24

Możesz spróbować tego, aby uzyskać strumień, tj. najpierw pobrać adres url, a następnie otworzyć go jako strumień.

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

Miałem kiedyś podobne pytanie: odczyt pliku txt z jar nie powiodło się, ale odczyt obrazu działa

 9
Author: MrD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:45

Wydaje się, że jest problem z Classloaderem, którego używasz. Użyj contextClassLoader do załadowania klasy. Jest to niezależnie od tego, czy jest to metoda statyczna/niestatyczna

Thread.currentThread().getContextClassLoader().getResourceAsStream......

 6
Author: Binita Bharati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-27 01:56:03

Nie wiem, czy pomoc, ale w moim przypadku miałem swój zasób w folderze / src / i dostawał ten błąd. Następnie przeniosłem zdjęcie do folderu bin i naprawiłem problem.

 2
Author: Leo Ufimtsev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-05 18:53:07

Upewnij się, że twój katalog zasobów (np. "src") jest w twojej ścieżce classpath (upewnij się, że jest to katalog źródłowy w twojej ścieżce budowania w eclipse).

Upewnij się, że clazz jest załadowany z głównego classloadera.

Następnie, aby załadować src / initialization / Lifepaths.txt, użyj

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

Dlaczego: clazz.getResourcesAsStream(foo) wyszukuje foo z wewnątrz ścieżki klas clazz, względem katalogu clazz mieszka w . Wiodący " / " powoduje, że ładuje się z katalogu głównego dowolnego katalogu w classpath clazz.

O ile nie znajdujesz się w jakimś kontenerze, takim jak Tomcat, lub robisz coś bezpośrednio z Classpath, możesz traktować swoją classpath linii eclipse/command jako jedyną CLASSPATH CLASSPATH.

 2
Author: Bobby Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-24 13:17:03

Znalazłem się w podobnej kwestii. Ponieważ używam Mavena, musiałem zaktualizować mój pom.xml, aby dołączyć coś takiego:

   ...
</dependencies>
<build>
    <resources>
        <resource>
            <directory>/src/main/resources</directory>
        </resource>
        <resource>
            <directory>../src/main/resources</directory>
        </resource>
    </resources>
    <pluginManagement>
        ...

Zwróć uwagę na znajdujący się tam znacznik zasobów, aby określić, gdzie znajduje się ten folder. Jeśli masz zagnieżdżone projekty (tak jak ja), możesz chcieć uzyskać zasoby z innych obszarów, a nie tylko w module, w którym pracujesz. Pomaga to ograniczyć przechowywanie tego samego pliku w każdym repo, jeśli używasz podobnych danych konfiguracyjnych

 1
Author: plosco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-08 00:12:31

W moim przypadku nic nie działało, chyba że usunąłem spacje z nazw plików...

 0
Author: user3563159,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-04 13:14:17

Zadziałało dla mnie dodanie pliku pod Mój projekt / Java Resources / src, a następnie użycie

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

Nie musiałem dodawać tego pliku do ścieżki (dodanie go do / src robi to najwyraźniej)

 -1
Author: pgonzaleznetwork,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-16 22:43:20

@ Emracool... Sugerowałbym Ci alternatywę. Od kiedy próbujesz załadować *.plik txt. Lepiej użyć FileInputStream() niż tego irytującego getClass().getClassLoader().getResourceAsStream() lub getClass().getResourceAsStream(). Przynajmniej Twój kod będzie działał poprawnie.

 -12
Author: Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-23 10:08:03