Otwieranie plikow - sciezka wzgledna

0

wczytuje plik konfiguracyjny w nastepujacy sposob:

 
File f = new File("plik.txt");
Properties props = new Properties();
InputStream is = new FileInputStream(f);
props.load(is);

Kiedy robie to w zwykłej aplikacji javy działa wszystko dobrze. "plik.txt" musi byc wtedy umieszczony w tym samym folderze co plik class, albo na dole paczki, jesli .class byl w paczce.

Problem pojawia się natomiast kiedy uruchamiam to samo w projekcie typu 'Dynamic Web Project'. 'plik.txt' umieszczalem we wszystkich mozliwych lokalizacjach projektu, a dostaje wyjatek ze plik nie moze byc zlokalizowany. Co wiecej, jesli wpisze na sztywno pelna bezwzgledna sciezke do pliku "C:\projekt..\plik.txt" to dziala. Chcialbym jednak uniknac takiego zapisu gdyz program staje sie malo uniwersalny i przy przeniesieniu projektu do innej lokalizacji nie zadziala.
Jak wiec mozna zdefiniowac sciezke wzgledna do tego pliku?

0

Oczywiście, ze mówi, ale chyba Tobie jednak nie. JFileChooser to swingowy komponent do wybierania plików przez użytkownika. A ja chciałbym jednak żeby pliki konfiguracyjne dla mojego programu były niewidoczne dla zwykłego użytkownika. Poza tym co? systemowe okienka w webowej aplikacji?? Chyba źle zrozumiałeś temat. Czytałem na forach zagranicznych ze ludzie tez maja z tym problem. Jest na to jedno rozwiazanie:

class Odczytuj{
props.load(Odczytuj.class.getResourceAsStream("plik.txt"));

}
 

Z tym, że to akurat mnie nie satysfakcjonuje bo jak pobrać uchwyt to nadpisania tego pliku?

0

To rozwiązanie, które podałeś jest jak najbardziej dobre, ale nadaje się tylko do odczytu. Zapisać nie możesz, bo plik będzie zwykle wewnątrz archiwum (jar, war, ear). Słuszne wydaje się użycie tutaj bazy danych, ale jak projekt nie korzysta z bazy, to dodawanie jej tylko do właściwości będzie przerostem formy nad treścią.
Zasadniczo, to musisz wiedzieć gdzie są twoje właściwości. Możesz wtedy napisać ścieżkę tak:
/plik.txt
Wtedy plik będzie się znajdował w katalogu głównym dysku, na którym jest serwer aplikacji. Możesz sobie go odczytywać i zapisywać, o ile system daje ci takie uprawnienia. Działa to na Linuksie i Windowsie.

0

Też miałem kiedyś podobny problem. Wystarczy jednak zlokalizować miejsce skąd załadowano klasę. Ten kawałek kodu powinien Ci pomóc:

class /*...*/ extends JApplet
	/**
	 * Pobiera ścieżkę katalogu z którego załadowano klasę niezależnie
	 * od tego czy jest ona apletem czy zostanie wbudowana do Okna Swing
	 * @return lokacja zasobu jako obiekt URL
	 */
	public URL getAppletCodeBase()
	{
		URL folder = this.getClass().getResource(".");
		if(folder == null)
			folder = this.getCodeBase();
		return folder;
	}
//...

Ten myk z zasobem "." działa również dla regularnych aplikacji (i we wszystkich znanych mi systemach). Na koniec możesz użyć URL.getPath().

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