Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Jak wykonać zapis odczyt danych na dysku


damianq20

Rekomendowane odpowiedzi

Opublikowano

mam taki spory problem chciałem zrobić jakiś  prosty system zapisu danych na dysku tak abym mógł bez problemów zapisywać informacje o danym graczu całość miała by działać dość elastycznie i wyglądać miej więcej tak ,

 

'nick':blee blee'
'uuid':--------
'jakas lista'-'dane numer jeden'
-'i jeszcze cos'
'i jakas mapa mapy z lista :)'{'poziom 1':'true'
'dane'-....
-...
}
    

 

 

 

w całości chodziło by  o umożliwienie dodania nowych elementów bez konieczności przepisywania całej baz , a zarazem wygodne funkcjonowanie :( ,

pewnie dało by radę zrobić to sqlite ale po ustaleniu tabel nie można chyba jej już zmienić , wiem też ze bukkit posiada jakąś serializacje ale nigdzie nie mogłem odszukać jakichś konkretów więc postanowiłem zrobić to samemu ,

 

jak na razie mam coś takiego

 

 

public class FlatData {
	
	private static final Charset encoding = Charset.defaultCharset();
	
	private final Map<String , Object> input = new HashMap<String , Object>();
	
	private ArrayDeque<Map<String , Object>> maps = new ArrayDeque<Map<String , Object>>();
	private ArrayDeque<String> keys = new ArrayDeque<>();
	private ArrayList<Object> list = null;
	
	private String key = null;
	private boolean str = false;
	private boolean isList = false;
	private int aps = 0;
	private int last = -1;
	private StringBuilder sb = new StringBuilder();
	
	public  Map<String , Object> readFlat(File file) throws IOException {
        try (InputStream in = new FileInputStream(file);
                Reader reader = new InputStreamReader(in, encoding);
                Reader buffer = new BufferedReader(reader)) {
        	maps.add(new HashMap<String, Object>());
        	int r;
        	while ( (r = buffer.read() )  != -1) {
        		decode(r);
        		last = r;
        	}
        }
	}
	
	
	private void decode (final int r ) {
		
		if (r == '\'') {
			if (str == false)
				str = true;
			else 
				str = false;
		}
		
		if (str == true) {
			sb.append((char ) r);
			return;
		}
		if (r == '-') {
			isList = true;
			return;
		}
		if (r == ':') {
			key = sb.toString();
			sb = new StringBuilder();
			return;
		}
		if (r == '{') {
			maps.addLast(new HashMap<String , Object>());
			keys.add(sb.toString());
			aps++;
			sb = new StringBuilder();
			return;
		}
		
		if (r == '\n') {
			if (isList == true) {
				list.add()
			}
			isList = false;
			if (key != null) {
				if (last == '-') {
					
				}
			}
		}
		
		
		
		if (r == '{') {
			keys.addLast(key);
			maps.addLast(new HashMap<String , Object>());
			aps++;
		}
		else if (r == '}') {
			final Map<String , Object> map = maps.getLast();
			maps.removeLast();
			maps.getLast().put(keys.getLast(), map);
			keys.removeLast();
			aps--;
		}
		else if (r == ':') {
			key = sb.toString();
			sb = new StringBuilder();
		}

		else if (r == '\n') {
			
		}
	}
	
	public static void saveData(Map<String , Object> map , File path) {
		
	}
}

 

 

 

no i nie wiem jak zrobić zapis mapa , lista , mapa i tak w nieskończoność ogólnie całość już powinna się zaciąć przy liście z mapami

Opublikowano

mam taki spory problem chciałem zrobić jakiś  prosty system zapisu danych na dysku tak abym mógł bez problemów zapisywać informacje o danym graczu całość miała by działać dość elastycznie i wyglądać miej więcej tak ,

 

 

'nick':blee blee'
'uuid':--------
'jakas lista'-'dane numer jeden'
-'i jeszcze cos'
'i jakas mapa mapy z lista :)'{'poziom 1':'true'
'dane'-....
-...
}
    

 

 

 

w całości chodziło by  o umożliwienie dodania nowych elementów bez konieczności przepisywania całej baz , a zarazem wygodne funkcjonowanie :( ,

pewnie dało by radę zrobić to sqlite ale po ustaleniu tabel nie można chyba jej już zmienić , wiem też ze bukkit posiada jakąś serializacje ale nigdzie nie mogłem odszukać jakichś konkretów więc postanowiłem zrobić to samemu ,

 

jak na razie mam coś takiego

 

 

public class FlatData {
	
	private static final Charset encoding = Charset.defaultCharset();
	
	private final Map<String , Object> input = new HashMap<String , Object>();
	
	private ArrayDeque<Map<String , Object>> maps = new ArrayDeque<Map<String , Object>>();
	private ArrayDeque<String> keys = new ArrayDeque<>();
	private ArrayList<Object> list = null;
	
	private String key = null;
	private boolean str = false;
	private boolean isList = false;
	private int aps = 0;
	private int last = -1;
	private StringBuilder sb = new StringBuilder();
	
	public  Map<String , Object> readFlat(File file) throws IOException {
        try (InputStream in = new FileInputStream(file);
                Reader reader = new InputStreamReader(in, encoding);
                Reader buffer = new BufferedReader(reader)) {
        	maps.add(new HashMap<String, Object>());
        	int r;
        	while ( (r = buffer.read() )  != -1) {
        		decode(r);
        		last = r;
        	}
        }
	}
	
	
	private void decode (final int r ) {
		
		if (r == '\'') {
			if (str == false)
				str = true;
			else 
				str = false;
		}
		
		if (str == true) {
			sb.append((char ) r);
			return;
		}
		if (r == '-') {
			isList = true;
			return;
		}
		if (r == ':') {
			key = sb.toString();
			sb = new StringBuilder();
			return;
		}
		if (r == '{') {
			maps.addLast(new HashMap<String , Object>());
			keys.add(sb.toString());
			aps++;
			sb = new StringBuilder();
			return;
		}
		
		if (r == '\n') {
			if (isList == true) {
				list.add()
			}
			isList = false;
			if (key != null) {
				if (last == '-') {
					
				}
			}
		}
		
		
		
		if (r == '{') {
			keys.addLast(key);
			maps.addLast(new HashMap<String , Object>());
			aps++;
		}
		else if (r == '}') {
			final Map<String , Object> map = maps.getLast();
			maps.removeLast();
			maps.getLast().put(keys.getLast(), map);
			keys.removeLast();
			aps--;
		}
		else if (r == ':') {
			key = sb.toString();
			sb = new StringBuilder();
		}

		else if (r == '\n') {
			
		}
	}
	
	public static void saveData(Map<String , Object> map , File path) {
		
	}
}

 

 

 

no i nie wiem jak zrobić zapis mapa , lista , mapa i tak w nieskończoność ogólnie całość już powinna się zaciąć przy liście z mapami

ale... ja mam inne pytanie, dlaczego nie użyjesz wbudowanego yamla lub wbudowanego jsona?

1438614356923701010629.png

 

Opublikowano

to tak z yaml (bukkit) korzystałem dawno temu i przestałem bo gdzieś w odmętach internetów wyczytałem że jest to mało wydajny sposób , a ja będę potrzebował tego do zapisu informacji o graczu , i nie potrzebuje tego zapisanego w aż tak elegancki sposób , chodzi mi jedynie o wygodny sposób zapisu odczytu danych.

 

josn , nie jestem pewny ale chodzi ci o bukkit serialization ? , to tutaj pojawia się zgrzyt bo nigdzie nic na ten temat nie mogłem odszukać  i nie wiem jak z tego korzystać

, próbowałem też odszukać jakichś bibliotek ale jedyne co odnalazłem to :

org.json.simple

ale z niego nigdy nie korzystałem

Opublikowano

to tak z yaml (bukkit) korzystałem dawno temu i przestałem bo gdzieś w odmętach internetów wyczytałem że jest to mało wydajny sposób , a ja będę potrzebował tego do zapisu informacji o graczu , i nie potrzebuje tego zapisanego w aż tak elegancki sposób , chodzi mi jedynie o wygodny sposób zapisu odczytu danych.

 

josn , nie jestem pewny ale chodzi ci o bukkit serialization ? , to tutaj pojawia się zgrzyt bo nigdzie nic na ten temat nie mogłem odszukać  i nie wiem jak z tego korzystać

, próbowałem też odszukać jakichś bibliotek ale jedyne co odnalazłem to :

org.json.simple

ale z niego nigdy nie korzystałem

biblioteka "Gson" wbudowana w bukkita. A yaml jest ok...

 

twój system nie będzie magicznym cudem wydajniejszy, a yaml nie jest też jakiś wolny, szybszy powinien być gson, szczególnie w kompaktowym zapisie, tylko niestety jest mniej czytelny, no ale nikt tego ręcznie chyba nie edytuje.

Zapisuj każdego gracza w osobnym pliki yaml i będzie dobrze... nie szukaj problemu tam gdzie go nie ma :D

 

A wydajniejsze rzeczy to raczej zapis binarny... bo jest znacznie mniejszy, tyle ze nie do edycji ręcznej, i zazwyczaj uzywa się i tak tekstowego do takich rzeczy. Co ty niby chcesz tam zapisywać że ma długo trwać? 

1438614356923701010629.png

 

Opublikowano

 liczyłem na to że dla każdego gracza będzie coś do 100 linijek po 10 znaków , co da miej więcej 1000 znaków i przy wejściu wyjściu gracza operacja I/O

nie mam zamiaru ręcznie tego edytować , więc czytelność nie leży w moim geście ,

nie wiem jak korzystać z tego wbudowanego gson , nie mogę też nic znaleźć w kontekście bukkit'a

ale mam sama bibliotekę

http://www.javadoc.io/doc/com.google.code.gson/gson/2.7

popaczam pooglądam , i już chyba bardziej życia sobie komplikować nie będę , skorzystam z json simple albo gson

 

dzięki za pomoc

Opublikowano

 liczyłem na to że dla każdego gracza będzie coś do 100 linijek po 10 znaków , co da miej więcej 1000 znaków i przy wejściu wyjściu gracza operacja I/O

nie mam zamiaru ręcznie tego edytować , więc czytelność nie leży w moim geście ,

nie wiem jak korzystać z tego wbudowanego gson , nie mogę też nic znaleźć w kontekście bukkit'a

ale mam sama bibliotekę

http://www.javadoc.io/doc/com.google.code.gson/gson/2.7

popaczam pooglądam , i już chyba bardziej życia sobie komplikować nie będę , skorzystam z json simple albo gson

 

dzięki za pomoc

1000 znaków to nic... 

A gson nie ma żadnego specjalnego wsparcia w bukkcie, musisz używać normlanie i samu tworzyć serializacje/deserializacje tam gdzie domyślne nie działa.

Yaml dla odmiany ma wsparcie, ale ja go nie do końca używam. (wkurza mnie to że domyślnie zapisuje do konfiguracji klasę, więc ja używam ich systemu ręcznie - sam wywołuje metodę .serialize i potem sam wybieram typ - ale do zapisu graczy można to olać, bo ja tego używam by zwiększyć czytelność konfiguracji - bo użytkownik będzie dziwnie patrzeć na "==: com.costam.blabla.Balbla"

1438614356923701010629.png

 

Opublikowano

wielkie dzięki za pomoc teraz robię serializację za pomocą gson bez własnych udziwnień I/O , biblioteka wydaje się prosta ,

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...