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"
filename
), który również próbowałem. Plik jest kompilowany do JAR w odpowiednim miejscu o odpowiedniej nazwie.
Jak mam to rozwiązać? 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
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:
- Sprawdź lokalizację pliku, który chcesz załadować wewnątrz JAR (a tym samym upewnij się, że rzeczywiście dodany do JAR)
- użyj ścieżki absolutnej: ścieżka zaczyna się od korzenia słoika
- 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)
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");
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);
}
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
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
......
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.
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.
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
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...
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)
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.
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