Pisanie w dowolnym miejscu do pliku

0

Witam mam taki problem, mianowicie czy da się jakoś za pomocą klasy FileWriter pisać w dowolnym miejscu w pliku tzn. np żeby sobie skoczyć do przypuścmy 5 linijki pliku i tam zacząć pisać? Bo miałem taki pomysł żeby użyć LineReadera na poczatku programu, zeby znalezc w której linijce mam pisać, a potem jakoś wlaśnie przy pomocy FileWritera do tej linijki skoczyć i tam zacząć pisać, tylko ze nie mam pojęcia jak to zrobic. Probówałem wcześniej to zrobić przy pomocy klasy RandomAccessFile, jednak ona nie wiadomo czemu powodowala ucinanie miejscami tekstu i dopisywała nieporządane znaki. Generalnie chodzi o to że to jest lista najlepszych wyników do każdego poziomu gry i po prostu trzeba dopisać inta do pliku w wybranym miejscu. Pozdrawiam

0

RandomAccessFile, jednak ona nie wiadomo czemu powodowala ucinanie miejscami tekstu i dopisywała nieporządane znaki.
NiepoŻądane. Pokaż kod. Klasa RandomAccessFile powinna działać OK, innych klas ci tu nie trzeba w tym przypadku. Czy musisz korzystać z plików tekstowych? Ja bym skorzystał z serializacji do przechowywania danych na dysku.

0

Tak muszę czytać, struktura pliku z rekordami mniej więcej wygląda tak

LEVEL1
1212232
LEVEL2
133123

Program ma działać tak, po zakończeniu każdego poziomu program otwiera plik z wynikami, szuka w nim danego poziomu i nadpisuje lub zostawia przypisany do niego najlepszy wynik. Oto kod metody która to robi:

 	public void setHighScore() {
		try {
		RandomAccessFile plik = new RandomAccessFile("wyniki.txt","rw");
		String k = new String();
		while ((k = plik.readLine())!= null){
			if (k.equals(levelname)) {
				long tx = plik.getFilePointer();
				int t = Integer.parseInt(plik.readLine()); // to poprzedni najlepszy wynik
				plik.seek(tx);
				if (t < counter.getResult()) // counter.getResult() zwraca moj wynik po ukonczeniu danego poziomu w postaci inta
					//plik.writeInt(counter.getResult()); wersja pierwsza pisania - wypisuje totalne krzaki
					plik.writeUTF(Integer.toString(counter.getResult())); //- tu wypisuje liczbę ale dodaje jeszcze jakies spacje i znaczki
			}
		}
		} catch (Exception E) {}
	}
0

W takim razie co się stanie, jeżeli np plik ma postać: 123456<koniec>,a potem wpisujesz do niego wartość 789? Będzie wyglądał tak: 789456. Aby zrobić dobrze zapisywanie, musisz po prostu za każdym razem kasować plik i generować od nowa, z nowymi danymi. Albo skorzystać z serializacji (ObjectOutputStream/ ObjectInputStream). Będzie jeszcze prościej. writeInt() zapisuje 4 bajty, bez konwertowania na ASCII czy UTF-8, więc to chyba nie dziwne, że przy potraktowaniu surowych danych jako tekstu dostajesz krzaki. Zresztą masz dokumentację (javadoc), w której jest to przecież opisane.

0

Czy te rekordy maja konkretna strukture? Typu najpierw nawza levela, max 20 bajtow, pozniej wynik int, 4 bajty, pozniej nazwa usera, max 20 bajtow (wielkosci zmyslone). Jesli tak, to RandomAccessFile doskonale sie do tego nadaje - chcesz zmienic rekord 20? int recNo = 20; ... raf.seek((20 + 4 + 20) * (n - 1)); raf.write() i tutaj swoje dane, z paddingiem stringow jesli sa krotsze.

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