Stolperhannes
Diablo-Veteran
- Registriert
- 5 April 2004
- Beiträge
- 1.502
Hallo Leute,
ich wende mich mit diesem Entwicklerblog an Leute, die vielleicht nicht nur modden wollen indem sie Tabelleneinträge austauschen, sondern aktiv ein wenig mit der kostenlosen und gut dokumentierten Programmiersprache Java beschäftigen wollen.
Ich selbst habe auch nur im zweistelligen Stundenbereich Erfahrung mit Java, deshalb ist Nichtwissen oder nicht hochoptimaler Code kein Grund zum schämen für mich...
Als erstes : Kostenloses Lehrbuch aus dem Addison Wesley Verlag Link Java 5.0 wiki
Als zweites: Die kostenlose hervorragende IDE Eclipse wiki , download
Ziel des Threads ist die Entwicklung nützlicher Tools anfänglich alleine im Zusammenhang mit TXT-Dateien. Zum Beispiel soll ein TXT-Prozessor geschrieben werden, der Mod-Module im Quelltext verarbeiten kann.
Außerdem ergibt sich als Nebeneffekt eine TXT-Modder-Programmiersprache... Damit lassen sich Beispiele bzw Tutorials! klarer formulieren und als Input für einen Präprozessor verwenden... Es wird automatisch gemoddet...
In den nächsten Posts beschreibe ich die TXT-Modder-Programmiersprache.
Für das eigene Experimentieren habe ich eine nachfolgende Klasse geschrieben:
Sie enthält alles was wichtig ist
- laden
- speichern (normal und als Backup)
- leere Tabelle erzeugen
- Zeilen holen, löschen, clonen, einfügen, leere Zeile erzeugen
- Einträge löschen, ersetzen, holen, suchen
ich wende mich mit diesem Entwicklerblog an Leute, die vielleicht nicht nur modden wollen indem sie Tabelleneinträge austauschen, sondern aktiv ein wenig mit der kostenlosen und gut dokumentierten Programmiersprache Java beschäftigen wollen.
Ich selbst habe auch nur im zweistelligen Stundenbereich Erfahrung mit Java, deshalb ist Nichtwissen oder nicht hochoptimaler Code kein Grund zum schämen für mich...
Als erstes : Kostenloses Lehrbuch aus dem Addison Wesley Verlag Link Java 5.0 wiki
Als zweites: Die kostenlose hervorragende IDE Eclipse wiki , download
Ziel des Threads ist die Entwicklung nützlicher Tools anfänglich alleine im Zusammenhang mit TXT-Dateien. Zum Beispiel soll ein TXT-Prozessor geschrieben werden, der Mod-Module im Quelltext verarbeiten kann.
Außerdem ergibt sich als Nebeneffekt eine TXT-Modder-Programmiersprache... Damit lassen sich Beispiele bzw Tutorials! klarer formulieren und als Input für einen Präprozessor verwenden... Es wird automatisch gemoddet...
In den nächsten Posts beschreibe ich die TXT-Modder-Programmiersprache.
Für das eigene Experimentieren habe ich eine nachfolgende Klasse geschrieben:
Sie enthält alles was wichtig ist
- laden
- speichern (normal und als Backup)
- leere Tabelle erzeugen
- Zeilen holen, löschen, clonen, einfügen, leere Zeile erzeugen
- Einträge löschen, ersetzen, holen, suchen
Code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TxtContainer {
public class LineColumn{
public int line;
public int column;
public LineColumn(int line, int column)
{
this.line=line;
this.column=column;
};
public LineColumn()
{
line=0;
column=0;
};
}
/**
* Beinhaltet alle Einträge der D2TXT-Datei
*/
StringBuilder content;
File FileName;
/**
* Die Spalten des Sheets sind mit Tabulatoren voneinander getrennt.
*/
final static String SEPARATOR = "\t";
final static String LINETERMINATOR = "\r\n";
int Columns=0;
int Lines=0;
public TxtContainer(File FileName)
{
this.FileName=FileName;
read(FileName);
makeBackup();
countLines();
countColumns();
}
/**
* <code>public void <b>read</b>(String FileName)</code><br><br>
*
* Liest die komplette Datei in einen Stringbuilder
* @param FileName Dateiname
*/
public void read(File FileName){
try {
//--- einlesen
//--- Puffer mit der Größe der Datei erzeugen
char[] ca=new char[(int)FileName.length()];
//--- Datei öffnen
BufferedReader f = new BufferedReader(
new FileReader(FileName));
//--- Datei komplett in Charpuffer einlesen
f.read(ca);
//--- datei schliesen
f.close();
//--- Stringbearbeitungsobjekt erzeugen
content =new StringBuilder();
//--- Stringoblekt mit Daten füllen
content.append(ca);
} catch (IOException e) {
e.printStackTrace();
}
}
public void makeBackup(){
String fn = FileName.toString().replace(".txt", ".bak");
write(fn);
}
public void write(){
write(FileName.toString());
}
/**
* <code>public void <b>write</b>(String FileName)</code><br><br>
*
* Schreibt die Tabelle an den vorgegebenen Ort
* @param FileName Dateiname
*/
public void write(String FileName)
{
try {
//--- Datei erzeugen
BufferedWriter f = new BufferedWriter(
new FileWriter(FileName));
//--- Gibt den ganzen Inhalt als Komplettstring aus
f.write(content.substring(0));
//--- Datei schliessen
f.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* <code>private void <b>countColumns</b>()</code><br><br>
*
* Zählt die Anzahl der aktuellen Spalten in der Tabelle
*/
private void countColumns()
{
Columns=0;
String s=this.getLine(0);
int i=0;
while (true){
Columns++;
i=s.indexOf(SEPARATOR, i);
if(i<0) break;
i+=SEPARATOR.length();
}
}
/**
* <code>private void <b>countLines</b>()</code><br><br>
*
* Zählt die Anzahl der aktuellen Zeilen in der Tabelle
*/
private void countLines()
{
Lines=0;
String s=content.substring(0);
int i=0;
while (true){
Lines++;
i=s.indexOf(LINETERMINATOR, i);
//--- Nachbedingung: i zeigt auf erstes Zeichen
//--- des LINETERMINATORs oder beeinhaltet -1
//--- wenn kein weiteres Zeilenendezeichen mehr
//--- gefunden wurde.
if(i<0) break;
//--- Auf erstes Zeichen nach Zeilenendezeichen weiterschalten
i+=LINETERMINATOR.length();
}
}
/**
* <code>public LineColumn <b>getLineColumn</b>(int index)</code><br><br>
* Gibt Zeile und Spalte zurück, in die der Index zeigt.
*
* @param index Index in den content
* @return Klasse vom Typ: LineColumn
*/
public LineColumn getLineColumn(int index){
LineColumn p=new LineColumn();
int l;
int c;
//--- Zeilen hochzählen bis zur richtigen Zeile
for (l=0;(l<Lines)&&(this.getLineEndIndex(l)<index);l++) ;
p.line=l;
//--- Spalten hochzählen bis zur richtigen Spalte
for (c=0;(l<Lines)&&(this.getColumnEndIndex(l, c)<index);c++) ;
p.column=c;
return p;
}
/**
* <code>public int <b>getColumnStartIndex</b>(int line, int column)</code><br><br>
*
* Gibt den Startindex eines Eintrages innerhalb der Tabelle zurück.
* Der Index zeigt auf erstes Zeichen im Eintrag.
* @param line Zeile
* @param column Spalte
* @return Startposition des Eintrages
*/
public int getColumnStartIndex(int line, int column)
{
//--- Vorbedingung Index zeigt auf erstes Zeichen
//--- in Spalte 0 in der Zeile 0
int index=0;
for(int l=0;l<line;l++)
index=content.indexOf(LINETERMINATOR, index)+LINETERMINATOR.length();
//--- Nachbedingung Index zeigt auf erstes Zeichen
//--- in Spalte 0 in der Zeile line
for(int c=0;c<column;c++)
index=content.indexOf(SEPARATOR, index)+SEPARATOR.length();
//--- Nachbedingung Index zeigt auf erstes Zeichen
//--- in Spalte column in der Zeile line
return index;
}
/**
* <code>public int <b>getColumnEndIndex</b>(int line, int column)</code><br><br>
* Gibt den Endindex eines Eintrages innerhalb der Tabelle
* ohne Zeilenendezeichen zurück.
* Der Index zeigt auf erstes Trennzeichen nach dem Eintrag.
*
* @param line Zeile
* @return Endposition des Eintrages
*/
public int getColumnEndIndex(int line, int column)
{
int index=this.getColumnStartIndex(line, column);
//--- Nachbedingung Index zeigt auf erstes Zeichen
//--- in Spalte column in der Zeile line
while ((content.charAt(index)!='\t')&&(content.charAt(index)!='\r'))
index++;
//--- Nachbedingung Index zeigt auf erstes Trennzeichen
//--- in Spalte column in der Zeile line
return index;
}
/**
* <code>public int <b>getLineStartIndex</b>(int line)</code><br><br>
* Gibt den Startindex einer Zeile innerhalb der Tabelle.
* Der Index zeigt auf erstes Zeichen in der Zeile.
* @param line Zeile
* @return Startposition der Zeile
*/
public int getLineStartIndex(int line){
return this.getColumnStartIndex(line, 0);
}
/**
* <code>public int <b>getLineEndIndex</b>(int line)</code><br><br>
* Gibt den Endindex einer Zeile innerhalb der Tabelle
* inklusive Zeilenendezeichen zurück.
* Der Index zeigt auf erstes Zeichen nach der Zeile.
*
* @param line Zeile
* @return Endposition der Zeile
*/
public int getLineEndIndex(int line){
return this.getColumnEndIndex(line, Columns-1)+LINETERMINATOR.length();
}
/**
* <code>public String <b>getLine</b>(int line)</code><br><br>
* Gibt eine Kopie einer Zeile aus dem Sheet inklusive aller
* Trenn und Zeilenendezeichen zurück
*
* @param line Zeilennummer
*/
public String getLine(int line){
return content.substring(this.getLineStartIndex(line),
this.getLineEndIndex(line));
}
/**
* <code>public void <b>deleteLine</b>(int line)</code><br><br>
* Löscht eine Zeile aus dem Sheet inklusive aller
* Trenn und Zeilenendezeichen
*
* @param line Zeilennummer
*/
public void deleteLine(int line){
content.delete(this.getLineStartIndex(line),
this.getLineEndIndex(line));
}
/**
* <code>public void <b>insertLine</b>(int line, String Linestr)</code><br><br>
* Fügt eine komplette leere Zeile in die Tabelle ein.
* Alle nachfolgenden Zeilen werden nach hinten verschoben.
*
* @param Linestr Eine komplette leere Zeile im Stringformat
* @param line Zeilennummer der neuen Zeile
*/
public void insertLine(int line, String Linestr){
content.insert(this.getLineStartIndex(line), Linestr);
}
/**
* <code>public String <b>newLine</b>(int columns)</code><br><br>
* Erzeugt einen String, der eine leere Zeile mit Anzahl Spalten repräsentiert.
* Inklusive Trennzeichen und Zeilenendezeichen
*
* @param columns Spalten
* @return Eine leere Zeile
*/
public String newLine(int columns){
String s="";
for (int i=0;i<columns-1;i++) s+=SEPARATOR;
s+=LINETERMINATOR;
return s;
}
/**
* <code>public String <b>newSheet</b>(int line, int columns)</code><br><br>
* Erzeugt einen String, der eine leere Tabelle mit Anzahl Zeilen
* und Spalten repräsentiert.
* Inklusive Trennzeichen und Zeilenendezeichen
*
* @param line Zeilen
* @param columns Spalten
* @return Eine leere Tabelle
*/
public String newSheet(int line, int columns){
String s="";
StringBuilder sb = new StringBuilder();
s=newLine(columns);
for (int i=0;i<line;i++) sb.append(s);
return sb.substring(0);
}
/**
* <code>public void <b>cloneLine</b>(int line)</code><br><br>
* Macht eine Kopie von einer Zeile und fügt sie am Ende der Tabelle an.
* @param line Zeilennummer der Zeile, die kopiert werden soll
*/
public void cloneLine(int line){
content.append(getLine(line));
countLines();
}
/**
* <code>public String <b>getEntry</b>(int line, int column)</code><br><br>
* Gibt die Kopie eines Eintrages aus der Tabelle
* @param line Zeilennummer
* @param column Spaltennummer
* @return Eintrag aus der Tabelle ohne Trennzeichen
*/
public String getEntry(int line, int column)
{
//--- Eintrag wird ohne Trennzeichen zurückgegeben
return content.substring(getColumnStartIndex(line,column),
getColumnEndIndex(line,column));
}
/**
* <code>public void <b>clearEntry</b>(int line, int column)</code><br><br>
* Löscht einen Eintrag in der Tabelle
* @param line Zeilennummer
* @param column Spaltennummer
*/
public void clearEntry(int line, int column){
content.delete(getColumnStartIndex(line,column),
getColumnEndIndex(line,column));
}
/**
* <code>public void <b>replaceEntry</b>(int line, int column, String Entry)</code><br><br>
* Ersetzt einen Eintrag in der Tabelle durch einen neuen Eintrag
* @param line Zeilennummer
* @param column Spaltennummer
* @param Entry Eintrag
*/
public void replaceEntry(int line, int column, String Entry){
clearEntry(line, column);
if (Entry!=null)
content.insert(getColumnStartIndex(line,column), Entry);
}
/**
* <code>public void <b>searchEntry</b>(String Entry)</code><br><br>
* Sucht einen Eintrag in der Tabelle.
* <code><b>indexOf</b>(Entry, index)</code> findet Teilstrings. Gesucht sind jedoch komplette
* Tabelleneinträge und nicht Teilstrings in Tabelleneinträge.
*
* @param Entry Gesuchter Eintrag
* @return Index des Eintrages
*/
public int searchEntry(String Entry, int index){
LineColumn lc=new LineColumn();
int i=index;
while(true){
//--- Teilstring suchen
i =content.indexOf(Entry,i);
//--- Wenn keinen Teilstring (mehr) gefunden, dann Ende
if (i<0)return i;
//--- Teilstring gefunden, Zeile und Spalte ermitteln
lc=this.getLineColumn(i);
//--- Eintrag in Tabelle ist identisch mit Suchstring
if(this.getEntry(lc.line, lc.column).equals(Entry))
return i;
//--- Tabelleneintrag war nicht Suchstring
i+=Entry.length();
}
}
}