Input/Output Große Dateien schnell Speichern/auslesen

N

.Niklas.

Gast
Hallo,
Ich arbeite zurzeit an einem Plugin für Minecraft und ich möchte Blöcke schützen, mein problem ist das es schon bei 10 tausend gespeicherten blöcken anfängt bei einem Server reload etwa 5-6 sekunden zu hacken

Ich lese die .yml aus mit:
Code:
	public String fileGetContent()
    {
        String buffer = "";
        String line = "";
        
        try
        {
            br = new BufferedReader(new InputStreamReader(new FileInputStream(myFile)));
            while((line = br.readLine()) != null) 
                buffer = (new StringBuilder(String.valueOf(buffer))).append(line = (new StringBuilder(String.valueOf(line))).append("\n").toString()).toString();
            br.close();
        }
        catch(Exception e)
        {
            System.out.println("[MineBuilder] A file is missing, please reload the server when this error is still there contact me");
        }
        return buffer;
    }

Und wird dann hier verarbeitet:
Code:
	private ArrayList<String> saveBlock = new ArrayList<String>();	

public void readBlockSaveFile()
	{
		configer saveBlockYml = new configer("plugins/MineBuilder","plugins/MineBuilder/SavedBlocks.yml");
		String[] saveBlockSplit = saveBlockYml.fileGetContent().split("\n");
		Boolean add = false;
		for(String addSave : saveBlockSplit)
		{
			if(add == true)
			{
				saveBlock.add(addSave);
			}
			if(addSave.contains("Latest Block at:"))
			{
				add = true;
				String[] numberSplit = addSave.split(":");
				amountOfSavedBlocks = Integer.parseInt(numberSplit[1]);
			}
		}
	}
Bei " String[] saveBlockSplit = saveBlockYml.fileGetContent().split("\n"); " dauert es sehr lange :(
(liegt nicht am split , ich habs getestet)


Und dann habe ich noch ein problem beim trennen der ArrayList gibts da eine Methode die schneller ist als

Code:
	public void writeBlockSaveFile()
	{
	    ArrayList<String> saveBlockCopy = new ArrayList<String>();
	    saveBlockCopy.addAll(saveBlock);  //Mit es keine errors gibt falls saveBlock sich verändert
		configer saveBlockYml = new configer("plugins/MineBuilder","plugins/MineBuilder/SavedBlocks.yml"); 
		String writeToFile = "Latest Block at:"+amountOfSavedBlocks+freizeile; //Speichert die array list in einen string
//Hier hackt es 
		for(String savePlaceBlock : saveBlockCopy)
		{
				writeToFile += savePlaceBlock+freizeile;

		}
//Speichert es in einem file 
		saveBlockYml.writeFile(writeToFile);
	}

Wie mache ich es das er die Datei schneller ausliest und Die ArrayList "blockSave" schneller speichern kann :)?

Mfg Niklas
 
J

J7Dev

Gast
Da merkt man irgendwie wieder dieses "wenn Kiddies wegen Minecraft anfangen mit Java zu spielen".

Nichts gegen dich, aber dieser MIST zeigt eindeutig das du da ne Menge ausm Netz zusammengeklickt hast und dich scheinbar mit Java überhaupt nicht auskennst.

Als Tipp gebe ich dir nur : anstatt EINEN String zu returnen der dann wieder gesplitet wird gib lieber gleich die List<String> zurück. Denn alleine deine "buffer=..." Zeile frisst unmengen an RAM und CPU. Und das gleiche geht dann beim spli() noch mal rückwärts. Das das extrem unperformant ist weis eigentlich jeder Java-Anfänger der sich schon mal mit Listen und dem Thema "Einlesen von Files" befasst hat ... was bei dir ganz offensichtlich nicht der Fall ist.
 
N

.Niklas.

Gast
Ich habe nicht wegen Minecraft mit Java angefangen.
ich habe nur das mit dem auslesen aus dem Internet genommen habe den rest habe ich selbst geschrieben tut mir leid das ich nicht seit jahren programmiere deswegen habe ich es ja auch unter "anfänger" gepostet ......
 
J

J7Dev

Gast
Ah ... wenn du also NICHT wegen MC mit Java angefangen hast und schon mit ArrayList rumspielst solltest du eigentlich wissen wie es richtig geht. Den Tipp habe ich dir gegeben.

(Was auch gehen würde : gleich die ganze List so wie sie ist speichern / laden / verwenden - Stichwort : Serializable)
 
N

.Niklas.

Gast
Bin grade erst beim theme ArrayLists ich arbeite an einem Plugin für MC um mir das Gelernte besser einzusprägen , und danke ich werde mal gucken
 
N

.Niklas.

Gast
Okay auslesen gibt keine probleme mehr aber beim speichern gibt es immer noch probleme , mit "Serializable" kann ich auch keine array liste in einem .yml File speichern so das die Verzögerung durch
Code:
		for(String savePlaceBlock : saveBlockCopy)
		{
				writeToFile += savePlaceBlock+freizeile;

		}

immer noch da ist
 
J

J7Dev

Gast
Erlich : ganz falsche Idee. Wenn du Java lernen willst dann mach das mit halbwegs "normalen" Übungen. Ein Bukkit-Plugin ist hier wohl die falsche Wahl da du dich auch mit einer weiteren API sowie deren Eigenenheiten auseinandersetzen musst deren Grundlagen du noch nicht mal gelernt hast.

Was "Serializable" ist hast du überhaupt nicht verstanden (wahrscheinlich nicht mal gegoogelt). Ansonsten würdest du nicht sagen das es mit diesem Code-Stück nicht gehen würde.

Ich wiederhole den Tipp noch mal in anderer Form : deine Performance-Bremse ist das du mit einem riesigen String arbeitest.

Mit serialization würde das so aussehen

Java:
public ArrayList<String> getFileContent() throws Exception
{
	ObjectInputStream obIn=new ObjectInputStream(new FileInputStream(myFile));
	return (ArrayList<String>)obIn.readObject();
}

Nicht mehr und nicht weniger. Speichern würde dann so aussehen

Java:
public void writeBlockSaveFile(ArrayList<String> list) throws Exception
{
	ObjectOutputStream obOut=new ObjectOutputStream(new FileOutputStream(myFile));
	obOut.writeObject(list);
}

Der Unterschied wäre das die entstehende .yml Datei (btw : YML ist hier die falsche Endung denn das YML-Format schreibt vor wie es aufgebaut ist was du komplett ignorierst. Die Bukkit-API sollte hierfür was bereitstellen.) nun ein Java-Objekt ist was man so nicht mehr direkt editieren kann.

Um das ganze also String-based umzusetzen würde ich es so machen

Java:
public ArrayList<String> getFileContent() throws Exception
{
	ArrayList<String> list=new ArrayList<String>();
	BufferedReader in=new BufferedReader(new InputStreamReader(new FileInputStream(myFile)));
	String line="";
	while((line=in.readLine())!=null)
	{
		list.add(line);
	}
	return list;
}

Damit hast du dann auch direkt deine "saveBlock" List und kannst dir den zweiten Code sparen.

Speichern wiederum umgekehrt

Java:
public void writeBlockSaveFile(ArrayList<String> list) throws Exception
{
	PrintStream out=new PrintStream(new FileOutputStream(myFile));
	for(String line : list)
	{
		out.println(line);
	}
}

Das ist alles.

Diesen ganzen String-Kram kannst du komplett löschen. Damit sparst du deutlich RAM und CPU und das ganze sollte auch noch relativ schnell laufen.

Da du ja leider nicht den Code gepostet hast mit dem das Laden nun läuft kann ich natürlich nicht beurteilen was da jetzt noch für Fehler drin sind, aber mit ein bisschen Wissen und Kenntnis der API (vor allem wie man mit der Doc arbeitet) wäre das ganze deutlich einfacher und performanter gewesen.

Und gewöhn dir bitte an [noparse]
Java:
[/noparse]-Tags zu verwenden.

Sowas sollte man echt drauf haben wenn man ein Bukkit-Plugin schreiben will. Mal ganz davon abgesehen das du vermutlich nicht mal wirklich weist was Vererbung und Interfaces sind; Wissen was du dafür nämlich brauchst. Auch ist die verwendung von "public" ein Anzeichen dafür das du mit "Datenkapselung" nicht viel anfangen kannst, denn man greift nie direkt auf Variablen zu sondern immer über Getter und Setter und hält den Scope so klein wie möglich.

Ich empfehle dir wirklich erstmal die Grundlagen und notwendige erweiterte Kenntnisse zu lernen bevor du dich an ein Bukkit-Plugin machst. Außerdem solltest du dich mit der Bukkit-API befassen wofür bei Fragen die Bukkit-Foren deutlich besser sind als dieses hier.
 

Thoosequa

Mitglied
Nur als verständnis Frage: Du willst etwas ähnliches machen wie LogBlock oder HawkEye? Oder meinst du mit Schützen Worldguard. Für ersteres empfielht sich nämlich eher eine MySQL Datenbank. Sowas als Flatfile zu speichern geht schwer auf die Serverleistung. Übrigens glaube ich auch, dass du auf der bukkit Seite besser aufgehoben bist.
 
N

.Niklas.

Gast
Nein nicht ganz , ich schreibe an einem Plugin womit man die Exp für alles einstellen kann , nun gibt es aber immer wieder exp wenn man den block wieder plaziert dies soll nur 20-30k zeilen schnell speichern und laden können das geht nun , danke an J7Dev...
Und ich kenne mich bereits mit vererbung und interfaces aus.

Da das ja nicht so mit bukkit zu tuen hat habe ich es hier gepostet :)
 
J

J7Dev

Gast
Mich würde gerne mal der gesamte Code interessieren was man da noch für Anfängerfehler finden würde. Ich bin mir sicher das man da noch so einige Performance-Bremsen lösen kann.

Außerdem : wenn Mojang es so entwickelt hat das du z.B. einen IronOre-Block abbaust, dafür XP bekommst, diesen selbst neu setzt und beim erneuten Abbauen wieder XP bekommst ... dann würde ich das eher mal im Mojang-Bugtracker melden oder nach entsprechenden Plugins suchen (gibt es bestimmt) anstatt mir ohne Grundlagen und mit vielen Anfängerfehlern selbst was zusammenbasteln zu wollen. Denn dafür reichen deine Java-Grundlagenkenntnisse wie man ja gesehen hat scheinbar nicht aus und das ganze besteht großteil nur aus zusammengeklicktem ausm Netz (wie nun auch mein Code-Stück Teil deines Plugins sein dürfte).
 
N

.Niklas.

Gast
Wie gesagt der code ist komplett selbst geschrieben das einzigste was ich aus dem internet kopiert habe war der teil zum schreiben und lesen von dateien
 
J

J7Dev

Gast
Kann ich erlich gesagt nich ganz glauben. Sich mit der Bukkit-API so gut auskennen um n Block-Filter zu basteln OHNE dabei vorlage von anderen Codes zu nutzen und dann nicht mal einfachste Java-File-I/O-Basics drauf haben ... sorry ... das passt einfach nich zusammen. Ich arbeite seit einige Jahren mit Java und habe schon viele "Anfänger" gesehen ... auch schon vor dem Minecraft-Hype ... aber es passt halt irgendwie nicht das man sich mit einer komplexen API auskennt und mit dieser oder Vorlagen arbeiten kann und dann nicht mal einfachste Java-Basics auf die Reihe bekommt. Aber naja ... würde mich wie gesagt nicht wundern wenn man noch etliche andere Fehler finden würde.
 

Thoosequa

Mitglied
Mal ganz OT:
Man bekommt XP's nur von Erzen die keine Erzen droppen. Coal ore droppt keine Ore sondern ein Kohelstück -> XP (selbes bei Lapis). Iron Ore droppt Iron Ore daher keine XP.
 
J

J7Dev

Gast
So genau kenn ich mich mit der 1.3.x noch nicht aus ... wäre aber interessant zu wissen was mit SilkTouch passiert ...
 
N

.Niklas.

Gast
Jup ich hab bestimmt mehrere Sachen drinne die den Server zwar nicht merklich ausbremsen aber trotzdem ressourcen fressend ist ,
Und sowas zu erstellen ist doch sehr simpel.

@Thoosequa
Mit meinem Plugin kannst du Exp für alle Blöcke einstellen , selbst Dirt kann dir exp geben :)
 
J

J7Dev

Gast
Jup ich hab bestimmt mehrere Sachen drinne die den Server zwar nicht merklich ausbremsen aber trotzdem ressourcen fressend ist ,
Und sowas zu erstellen ist doch sehr simpel.

@Thoosequa
Mit meinem Plugin kannst du Exp für alle Blöcke einstellen , selbst Dirt kann dir exp geben :)

Ahh ... es ist also simpel mit der Bukkit-API Plugins für eine bestimmte Aufgabe zu erstellen OHNE Java-Basics drauf zu haben ? -> "ausm-netz-zusammen-ge-klicktes-was-nich-läuft-SCHROTT".

Lern mal Java und die Basics ... dann musst du das Forum hier nich flooden.
 
N

.Niklas.

Gast
Ganz ehrlich , dies ist ein forum für ANFÄNGER und das Plugin läuft nicht wie Schrott.
Nur weil ich noch nicht beim Speichern/laden von Daten das heißt nicht das ich mir alles aus dem internet zusammen klicke !
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Performant große Dateien durchsuchen Java Basics - Anfänger-Themen 8
S Große Text dateien einbinden Java Basics - Anfänger-Themen 3
S Arbeitsfeld in gleich große Bereiche einteilen Java Basics - Anfänger-Themen 2
G Best Practice Wie große "Tabellen" effizient durchsuchen und Daten händeln? Java Basics - Anfänger-Themen 15
C Große Zahlen vergleichen Java Basics - Anfänger-Themen 19
S 4 große Textdateien zu einer Mergen Java Basics - Anfänger-Themen 5
K Große Datenliste Java Basics - Anfänger-Themen 2
E Große Datenmengen effizient in CSV File speichern Java Basics - Anfänger-Themen 4
1 Extrem große Variable Java Basics - Anfänger-Themen 1
S Best Practice MVC und große Datenmengen aus einer mySQL - Datenbank Java Basics - Anfänger-Themen 24
M Mergesort Aufgabe große Probleme Java Basics - Anfänger-Themen 9
P Schneller Quadratzahltest für beliebig große natürliche Zahlen Java Basics - Anfänger-Themen 2
T Scanner für große Textdatei Java Basics - Anfänger-Themen 11
B große jpeg verarbeiten Java Basics - Anfänger-Themen 8
K Große Gleitkommazahlen runden Java Basics - Anfänger-Themen 8
X Compiler-Fehler javac - 08 eine zu große int? Java Basics - Anfänger-Themen 11
turmaline String teilen in gleich große strings Java Basics - Anfänger-Themen 15
F Große Potenzen berechnen Java Basics - Anfänger-Themen 6
J Große .txt einlesen - Idee? Java Basics - Anfänger-Themen 16
E Datentypen Große Zahl erzeugen Java Basics - Anfänger-Themen 5
P Kleines Projekt -> Große Überlegungen Java Basics - Anfänger-Themen 2
F Große Daten und große Array Java Basics - Anfänger-Themen 21
J Große animierte Gif preloaden und solange mit einer nicht animierten ersetzen Java Basics - Anfänger-Themen 5
Povlsen84 Datentypen Große, sortierte, schnelle Datenstruktur Java Basics - Anfänger-Themen 9
H Große Projekte mit Java - Ausführbare Datei Java Basics - Anfänger-Themen 2
K Eclipse EMF und das große HÄ? Java Basics - Anfänger-Themen 5
T .split(";") nicht gleich große arrays werden erzeu Java Basics - Anfänger-Themen 2
G String aus Zahlen multiplizieren -> unendlich große ! Java Basics - Anfänger-Themen 13
M Spielt der Debugger bei java eine große Rolle Java Basics - Anfänger-Themen 3
C große Matrizen, Performance, (Pointer?) Java Basics - Anfänger-Themen 6
L JTextArea große setzen Java Basics - Anfänger-Themen 5
S große probleme mit java Java Basics - Anfänger-Themen 6
R große Datenmenge in Datei schreiben Java Basics - Anfänger-Themen 8
M FileOutputStream und zu große Zahlen! Java Basics - Anfänger-Themen 10
J Große *.Text Datei zum verschicken in viele kleine Java Basics - Anfänger-Themen 7
B Probleme große Strings zu schreiben Java Basics - Anfänger-Themen 2
A große errechnete datenmengen sofort in datei schreiben? Java Basics - Anfänger-Themen 6
R große Zahlen Java Basics - Anfänger-Themen 4
R Große Zahlen Java Basics - Anfänger-Themen 3
T Große Zahlen aufgesplittet in verketteter Liste speichern Java Basics - Anfänger-Themen 4
N Große Probleme mit StingBuffer und Array Java Basics - Anfänger-Themen 2
I Dateien aus dem Resource Folder laden Java Basics - Anfänger-Themen 2
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
Buroto Threads Verschiedene .txt Dateien Auf Listen und Verbinden Java Basics - Anfänger-Themen 3
J Dateien lesen und schreiben Java Basics - Anfänger-Themen 5
B Jar Dateien ohne IDE verwenden? Java Basics - Anfänger-Themen 1
A Optimierung eines Programms: Mergen der Dateien Java Basics - Anfänger-Themen 23
A Zwei XML-Dateien Mergen Java Basics - Anfänger-Themen 14
A Input/Output Mehrere Csv-Dateien einlesen Java Basics - Anfänger-Themen 2
LetsSebi Dateien werden nicht in Zip gespeichert Java Basics - Anfänger-Themen 1
J Alle .java Dateien von einem Verzeichnis in eine Zip speichern Java Basics - Anfänger-Themen 2
J Alle Dateien aus einem Verzeichnis laden Java Basics - Anfänger-Themen 10
MiMa log4j als separate Dateien in Schleife? Java Basics - Anfänger-Themen 6
M Scannen von *.txt - Dateien; wo sind der oder die Fehler? Java Basics - Anfänger-Themen 4
A Input/Output Dateien einlesen und ausgeben Java Basics - Anfänger-Themen 7
S Lese- / Schreibfähigkeit von Dateien sicherstellen Java Basics - Anfänger-Themen 1
C "HelloWorld" - Dateien erstellt, aber ist es eine class-Datei? Java Basics - Anfänger-Themen 2
J Java findet plötzlich die Dateien im Projekt nicht mehr. Java Basics - Anfänger-Themen 12
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
L Classpath Alle Dateien im Classpath finden Java Basics - Anfänger-Themen 4
MiMa Formate für Dateien und Pfade? Java Basics - Anfänger-Themen 1
O Datei in mehrere kleine Dateien umwandeln Java Basics - Anfänger-Themen 47
L Richtige Reihenfolge der Dateien Java Basics - Anfänger-Themen 5
CptK Datentypen Text Dateien einlesen Java Basics - Anfänger-Themen 3
J Logging erzeugt zwei dateien.... Java Basics - Anfänger-Themen 7
A Dateien Verschieben Java Basics - Anfänger-Themen 1
M Mehre Dateien parallel kopieren mit Multithreading Java Basics - Anfänger-Themen 8
C Methoden Dateien im Ordner anzeigen Java Basics - Anfänger-Themen 12
J Java-Dateien lassen sich nicht editieren Java Basics - Anfänger-Themen 46
E FTP Dateien hochladen Java Basics - Anfänger-Themen 3
J Probleme beim schreiben von Dateien Java Basics - Anfänger-Themen 5
Korvinus Vergleichen von 2 csv-Dateien Java Basics - Anfänger-Themen 2
I Texte mit Absätzen in Dateien speichern und auslesen Java Basics - Anfänger-Themen 1
M "substring()" mit Dateien und Pfadangaben Java Basics - Anfänger-Themen 5
Voreck Jar Dateien Standart programm ändern Java Basics - Anfänger-Themen 12
K Dateien aus Source-Package verwenden Java Basics - Anfänger-Themen 10
B Dateien aus dem "resource" - Folder kopieren in Verzeichnis Java Basics - Anfänger-Themen 9
B Kopieren von Dateien mit Adminberechtigungen Java Basics - Anfänger-Themen 14
F Threads ftp4j, viele Dateien upload Java Basics - Anfänger-Themen 5
P Einen Ordner mit Dateien hochladen [FTP] Java Basics - Anfänger-Themen 2
X Dateien direkt hintereinander schreiben, Dateiname Java Basics - Anfänger-Themen 25
G Messwerte in 2 Dateien schreiben Java Basics - Anfänger-Themen 20
C Verarbeitung von sehr großen Dateien Java Basics - Anfänger-Themen 52
F Input/Output Dateien lesen/schreiben Java Basics - Anfänger-Themen 1
V Mehrere Dateien aus JFileChooser in eine ArrayList speichern Java Basics - Anfänger-Themen 2
K Dateien lesen | IndexOutOfBoundsException Java Basics - Anfänger-Themen 2
T Classpath Problem mit dem auslesen von Text-Dateien (Pfad) Java Basics - Anfänger-Themen 3
A attach source: Zusammenhang zwischen JAR und .class/.java Dateien? Java Basics - Anfänger-Themen 2
T .jar Datei als Ordner benutzen/ Dateien aus .jar Datei auslesen Java Basics - Anfänger-Themen 3
C Klassen Class Files nachladen (mehrer .jar Dateien) Java Basics - Anfänger-Themen 2
Bluedaishi for schleife um Dateien wieder zusammen zu fügen Java Basics - Anfänger-Themen 11
S Resourcen-Dateien im Jar-File verfügbar machen (Intellij 14) Java Basics - Anfänger-Themen 14
J Dateien für anderen User "mitgeben" Java Basics - Anfänger-Themen 1
S Dateien mit Java verschieben Java Basics - Anfänger-Themen 6
A Heap Space Error bei rekursiver Suche in Dateien trotz nur einer Zeile im Speicher Java Basics - Anfänger-Themen 26
E Dateien werden nicht gelöscht Java Basics - Anfänger-Themen 10
S Class Dateien decompilieren Java Basics - Anfänger-Themen 4
T Fehler beim Schreiben in Dateien! Java Basics - Anfänger-Themen 4
Bluedaishi Dateien Lassen sich unter windows nicht löschen Java Basics - Anfänger-Themen 8
Z Mehrere XML-Dateien zu einer zusammenfügen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben