problem z getResource() w paczkach .jar

0

Witam,

mam takowy problem:
piszę aplikację która coś tam ma robić (co tu już nieistotne) i ustawienia programu chciałem zapisywać w jednej z dwóch form:
plik ini - z tym miałem najmniej problemów
lub w sqlite - bo oprócz tego dorzuciłbym sobie jeszcze zapisywanie różnych statystyk, więc to rozwiązanie dla mnie znacznie lepsze by było, aczkolwiek nie płakałbym, gdyby nie było, plik ini mi wystarczy

odczyt pliku ini działa ładnie - zero problemów:

p.load(this.getClass().getResourceAsStream("/FTControl/properties.ini"));

p - Properties()

jednak mam problem z zapisem, ponieważ getResourceAsStream nie mogę użyć - zwraca InputStream, a do zapisu potrzebny mi OutputStream, więc zrobiłem tak:

FileOutputStream out = new FileOutputStream(this.getClass().getResource("/FTControl/properties.ini").getFile());

no i jak uruchamiam aplikację w IDE (NetBeans) wszystko działa dokładnie tak jak potrzebuję, .getResource() spełnia swoją funkcję idealnie. Problem zaczyna się w przypadku spakowania całości w jar i uruchomienie poza IDE - zwraca błąd:

"java.io.FileNotFoundException: file:\D:\ ...(ścieżka do projektu)... \FTControl.jar!\FTControl\properties.ini (The filename, directory name, or volume syntax is incorect)"

po przejrzeniu wielu stron na ten temat sprawdziłem dokładnie wielkości liter: wszystko się zgadza, wielkości są takie jak powinny - zresztą jakby wielkości liter były złe, to i by getResourceAsStream() też się wywalało - a działa bardzo dobrze

sqlite w ogóle nie mogę zrobić, bo muszę plik bazy otwierać poprzez getResource() i w IDE oczywiście otwiera prawidłowo - w systemie już nie - błąd ten sam, nie może znaleźć pliku

zawartość paczki (rozpakowanej):

...(ścieżka do projektu)... \FTCONTROL
+---FTControl
| | Main.class
| | properties.ini
| |
| ---images
....

Znalazłem jedną wydaje mi się sensowną poradę, że w czasie pakowania (w tamtym przypadku Eclipse) nie zachowuje ścieżek w środku jara, i trzeba gdzieś zaznaczyć, że ma to zostawiać tak jak jest

macie jakieś porady jak to naprawić/obejść, żeby aplikacja mogła otwierać i zapisywać plik w środku paczki?

z góry dzięki :)
(a jeśli jest coś z powodu moje przeoczenia to nie bijcie [za mocno] :P )

EDIT: aha, i jeszcze jedno: pisane na Windowsie :P

0

Ścieżki musi zachowywać, bo chociażby ma podział na pakiety. Spróbuj:

FileOutputStream out = new FileOutputStream(this.getClass().getResource("FTControl/properties.ini").getFile());

Jeden znaczek w ścieżce ma znaczenie.

0

Moim zdaniem jak masz jar to wolanie getResource().getFile() nie ma sensu bo file nie zworci pliku. Powinienes zrobic getResourceAsStream(), zadziala za kazdym razem byle tylko zasob byl w classpath.

0

A scislej - zwroci plik ktory ma znak ! ktory wskazuje ze to jest zasob z jara, i na to wyglada ze FileInputStream nie daje rady przy takim czyms poniewaz szuka pliku na dysku.

0

@Koziołek
nie mogę dać bez "/" bo to znaczy, że ma zacząć szukać w katalogu głównym, bez tego nawet w IDE nie działa, zwraca NullPointerException

@trelemelek
ale nie mogę użyć w tym miejscu getResourceAsStream() ponieważ on zwraca InputStream. DO zapisu potrzebuję OutputStream, więc muszę go stworzyć, a konstruktor FileOutputStream() wymaga albo ścieżki jako String - to nie działa, albo File - też nie działa

na razie to rozwiązałem poprzez umieszczenie properties.ini poza paczką i otwieram ten plik normalnie, ale szczerze mówiąc średnio mi się to rozwiązanie podoba, bo moje założenie było - jedna mała paczuszka, w której jest wszystko (łącznie z ustawieniami)

no trudno

dzięki za pomoc :)

0

Jesli dobrze rozumiem to chcesz dodac plik do archiwum jar. Jesli tak to zupelnie zle sie za to zabierasz (poczytaj o JarFile, JarOutputStream). Jesli nie, to pomysl - zwracasz plik z jara, i chcesz do niego zapisywac za pomoca strumienia ktory szuka plikow na dysku? Zle. Podobnie jakbys mial URI jakiejs stronki i zwrocil z niej obiekt File i probowal zpaisywac - bez sensu, nie tedy droga.

1 użytkowników online, w tym zalogowanych: 0, gości: 1