Nazwa otwieranego pliku

0

Witam,
tworze sobie swój notatnik w swingu. Notatnik próbuje odwzorować praktycznie 1:1 z notatnikiem Windowsa. Jak zwykle pojawiają się problemy, na które trzeba znaleźć odpowiedź.

Otóż, jeśli w systemie mamy jakieś pliku .txt i ustawimy ich uruchamianie w notatniku to w setTitle ramki notatnika pojawia się nazwa pliku np. "plik.txt - Notatnik". Mój problem polega na tym, aby zdobyć jakoś informację o nazwie pliku który został otwarty bezpośrednio z systemu.

Ma ktoś jakiś pomysł? :(

0

Jeśli masz plik file który jest obiektem klasy File możesz wywołać metodę

file.getName();
0

Takk, tylko mi chodzi o taki przypadek, że jest sobie np. na pulpicie plik tekst.txt , mam ustawione uruchamianie plików .txt w moim programie, klikam dwa razy na niego i mi się otwiera i tam już ustawia setTitle ramki na nazwę tego pliku który właśnie otworzyłem. Jak to wszystko ogarnąć, że mój program będzie wiedział co otworzył.

0

A to nie jest tak że wtedy nazwa tego pliku leci do args[] metody main?

0

Hmm, dobre pytanie. Tylko jeszcze jest problem jak z pliku .jar zrobić, żeby można było plikom tekstowym przypisać mój domyślny notatnik :S

0

Zrobiłem sobie Notatnik.bat , a tam "java -jar Notatnik.jar" i ustawiłem Notatnik.bat jako domyślny program do plików tekstowych, w programie zrobiłem drukowanie args[], po uruchomieniu pliku tekstowego dwukrotnym kliknięciem, niestety nic tam nie było :/

0

Bo źle zrobiłeś. To twój bat dostał argumenty które potem olał. Muisz je przekazać dalej do twojej komendy wywołującej jara :)

0

Nom,Nom. Dałem w bat na sztywno "java -jar Notatnik.jar lol.txt" i wydrukowało. Teraz tylko jak teraz tego bata zrobić żeby brał nazwę pliku który go otwiera ;<

0

A jak dasz tam jakieś %* żeby wrzucic wszystkie argumenty które dostał bat?

0

Wyświetla pełną ścieżkę pliku który otworzyłem.

0

No to chyba to co chciałeś?

0

Samą nazwę pliku, bez pełnej ścieżki ^^

0

Ok, nie pomyślałem, żeby teraz tego argsa ogarnąć.

String t ="";
		
		
		 for(String a : args) {
			 t+= a;
		 }
 
		final File file = new File(t);


   frame.setTitle(file.getName() + " - Notatnik");
1

Sklejasz wszystkie argsy w 1 string i z tego robisz plik? Toz to dziala tylko z jednym argumentem, z >=2 nie ma sensu...

0
mućka napisał(a):

Sklejasz wszystkie argsy w 1 string i z tego robisz plik? Toz to dziala tylko z jednym argumentem, z >=2 nie ma sensu...

Chciałem zrobić tak jak mówisz i zrobiłem:

final File file = new File(args[0]);

No ale..

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0

0
Blackq napisał(a):

Nom,Nom. Dałem w bat na sztywno "java -jar Notatnik.jar lol.txt" i wydrukowało. Teraz tylko jak teraz tego bata zrobić żeby brał nazwę pliku który go otwiera ;<

Uruchamiający plik .bat:
java -jar Notatnik.jar %1
To samo można wrzucić w rejestrze windy jako polecenie przypisane do konkretnego rozszerzenia/typu, ale wtedy warto użyć wywołania "javaw.exe", które nie tworzy zbędnej konsoli. Trzeba tylko pamiętać, że kiedy ręcznie wywołujesz, to nazwy plików ze spacjami muszą być w cudzysłowach. Przypisanie w rejestrze można wykonać za pomocą scalenia gotowego pliku .reg dla rejestrowania i wyrejestrowania, metod javy (musisz wygooglać) lub po prostu z łapy w edytorze rejestru.
To co wleci jako %1 będzie pełną ścieżką do pliku, który otworzysz za pomocą menu kontekstowego i znajdzie się w tablicy args[] wywołania programu javowego jako pierwszy i jedyny element.
Wtedy to otworzysz sobie jako plik. Ponieważ klasa File jest już w zasadzie przestarzała, to lepiej do tego celu użyć klasy FileChannel (oraz Files) ponieważ dzięki temu łatwo będzie można sobie wczytać cały plik do bufora (teksty rzadko przekraczają kilkaset KB). A następnie ustawiać kodowanie i dekodowanie wczytanego bufora przy pomocy klas Charset bo obsługa File koduje i dekoduje tylko domyślny Charset. Nie będziesz mógł sobie wtedy wybrać czy chcesz mieć plik zakodowany w: "UTF-16LE", "UTF-16BE", "UTF-16", "UTF-8", "windows-1250", "IBM852" lub "ISO-8859-2", a to w przypadku notatnika przydaje się. Weź pod uwagę, że nazwa pliku też może mieć znaki narodowe, więc jest zwykle zakodowana domyślnym dla JVM charsetem - ale w sumie nie musisz nic robić bo wszystkie teksty, które są już w pamięci mają z automatu kodowanie UTF-16LE, które jest standardowe dla Javy i przy operacjach plikowych nazwy są konwertowane do kodowania obowiązującego w systemie.
Przykład użycia:

String[] csnames =
{
	"UTF-16LE", "UTF-16BE", "UTF-16", "UTF-8",
	"windows-1250", "IBM852", "ISO-8859-2",
};
Map<String, Charset> available = Charset.availableCharsets();
String csn = csnnames[3]; //UTF-8 przykładowo
Charset cs = Charset.isSupported(csn) ? available.get(csn) : Charset.defaultCharset();
Path fn = dir.resolve(args[0]); //najpierw sprawdzić args.length

//przykład najprostszego zapisu zawartości do pliku o podanym kodowaniu
try (FileChannel file = FileChannel.open(fn, CREATE, WRITE))
{
	file.write(cs.encode(CharBuffer.wrap("Jakiś polski tekst ąćęłńóśźż w kodowaniu " + cs.name() + "\r\n")));
}
catch(IOException ex)
{
	//... błąd zapisu, w tym brak miejsca na dysku
}

//przykład odczytu z użyciem bufora na cały rozmiar pliku
try (FileChannel plik = FileChannel.open(fn))
{
	int fileSize = file.size();
	ByteBuffer bb = ByteBuffer.allocateDirect(fileSize);
	if(bb == null)
		//brak pamięci na bufor
	int readBytes = file.read(buf);
	if(readBytes == fileSize)
	{
		CharSequence charBuffer = cs.decode(bb); //dekodowanie bufora w kodowaniu cs, rozmiar będzie inny niż bb
		//charBuffer zawiera zdekodowany z pliku tekst w UTF-16 i można go wrzucić do kontrolki tekstowej
	}
	else //wczytano mniej niż cały plik
	{
		//...
	}
}
catch(IOException err)
{
	//... błąd wczytywania
}

Przykłady z palca, tylko do ogarnięcia.

0

Bzdury. Klasa File sama nic nie dekoduje i nie ma nic wspolnego z charsetami, i uzywajac tej klasy mozna z cala pewnoscia wybrac sobie kodowanie - new InputStreamReader (new FileInputStrean (file), StandardCharsets.UTF_8) itp.

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