Dateibearbeitung

Turk66

Mitglied
Hallo Leutz,
Ich möchte, dass mein Programm folgendes aus der Textdatei ausliest:

<VirtualHost 192.168.86.103:80>
Den ServerName my.test.de
Den DocumentRoot /tmp
Den ProxyPass / http://backend-server:443/bla/


<VirtualHost 192.168.86.105:80>
Den ServerName my.test2.de
Den DocumentRoot /tmp
Den ProxyPass / http://backend-server:443/bla/


Sprich für jeden VirtualHost Block will ich die 3 Informationen ausgelesen bekommen.
Jeder "Bock" fängt an mit <VirtualHost 192.168.86.103:80> und endet mit </VirtualHost>.


Zu meinem Code:
Ich bin einfach hingegangen, habe versucht die VirtualHost Informationen auszulesen und einem
String zuzuweisen.
Dann geh ich hin, und lese die Daten ServerName, DocumentRoot und ProxyPass aus, und weise
Sie auch zu Variablen hinzu.

Mein Problem ist, mein Programm zeigt einfach nichts an?!
Ich habe zum testen den String Variablen den Wert "a" gegeben, damit Ich sehe falls eine falsche Zuweisung passiert ist ich überhaupt was ausgegeben bekomme.
Aber ich kriege einfach garnichts ausgegeben.



So sieht die textdatei aus:

<VirtualHost 192.168.86.103:80>
ServerName my.test.de
ServerAlias 192.168.86.103
ServerAdmin soc.ce@test.com
DocumentRoot /tmp
ErrorLog /data/root_ww/logs/my.grohe.de/error_log
CustomLog /data/root_www/logs/my.grohe.de/access_log combined

# dibale HTTP Trace method
RewriteEingine on
RewriteLog /data/root_www/logs/my.grohe.de/rewrite.log

RewriteCond %{REQUEST_METHOD} !^(GET|POST|PUT|HEAD)$
RewriteRule .* - [F]

ProxyPass / http://backend-server:443/bla/
ProxyPassReverse / http://backend-server:443/bla/

<Proxy *>
order deny,allow
allow from all
</Proxy>

<LocationMatch ".">
order deny, allow
Allow from 193.34.68.165

Allow from 80.66.22.105
Allow from 213.31.212.151
deny from all
</LocationMatch>


</VirtualHost>



<VirtualHost 192.168.86.105:80>
ServerName my.test2.de
ServerAlias 192.168.86.103
ServerAdmin soc.ce@test.com
DocumentRoot /tmp
ErrorLog /data/root_ww/logs/my.grohe.de/error_log
CustomLog /data/root_www/logs/my.grohe.de/access_log combined

# dibale HTTP Trace method
RewriteEingine on
RewriteLog /data/root_www/logs/my.grohe.de/rewrite.log

RewriteCond %{REQUEST_METHOD} !^(GET|POST|PUT|HEAD)$
RewriteRule .* - [F]

ProxyPass / http://backend-server:443/bla/
ProxyPassReverse / http://backend-server:443/bla/

<Proxy *>
order deny,allow
allow from all
</Proxy>

<LocationMatch ".">
order deny, allow
Allow from 193.34.68.165

Allow from 80.66.22.105
Allow from 213.31.212.151
deny from all
</LocationMatch>


</VirtualHost>



Hier meine Klassen:

Java:
import java.io.BufferedReader;
import java.io.FileReader;


public class Start {
	
	public static void main(String[] args)
	{  
		String zeile;
		Datenzugriff confdatei = new Datenzugriff("C:\\Users\\taltinta\\Desktop\\my.website.de.conf", "r");
		
		String serverSuchraum[] = {};
		int i = 0;
		int count = 1;
		
		if (confdatei.oeffneZumLesen()== true)
		{
			zeile = confdatei.liesZeile();
			while(zeile != null)
			{
					//Ließt die Zeilen solange ein, biss er VirtualHost trifft und speichert es in ein Array
					count++;
					if (zeile.startsWith("<VirtualHost ")) {
						int zeilennr = count;
						serverSuchraum[i] = zeile;
						System.out.println(serverSuchraum);
						i++;
						
					}
				}
				
			//Zum testen habe ich den Variablen einfach Werte zugewiesen
			String serverName = "a";
			String verzeichnis = "a";
			String proxy = "a";
				
				
					do {
						zeile = confdatei.liesZeile();
						
						if(zeile.startsWith("ServerName")) {
							serverName = zeile;
							
						}
						if(zeile.startsWith("DocumentRoot")) {
							verzeichnis = zeile;
						}
						if(zeile.startsWith("ProxyPass")) {
							proxy = zeile;
						}
						//Alle Daten zum 1. VirtualHost werden ausgelesen
						
						//Ausgabe der Daten
						System.out.println("ServerName: " + serverName + "\n");
						System.out.println("Verzeichnis: " + verzeichnis + "\n");
						System.out.println("Proxy: " + proxy + "\n");
						System.out.println("\n\n");
						
					
					}while(zeile.startsWith("</VirtualHost>"));
				
			}

			
			}
		}


Java:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Datenzugriff
{   
	String dateiname;
	String modus;
	BufferedReader br;

	public Datenzugriff(String name, String modus)
	{
		this.dateiname=name;
		this.modus=modus;
	}

	public boolean oeffneZumLesen()
	{
		try 
		{
			//Die Datei ließt nur die Daten! Keine Änderungen werden vorgenommen
			if (modus.equals("r"))
			{  
				FileReader fr = new FileReader(dateiname);
				br = new BufferedReader(fr);
			}
		}
		catch (IOException ex)
		{ 
			System.out.println("Fehler beim Öffnen zum Lesen");
			return false;
		}
		return true;
	}

	//Liest eine Zeile ein und gibt diese zurück
	public String liesZeile()
	{ 
		String zeile = "";
		try
		{  
			zeile = br.readLine();
		}
		catch (IOException e)
		{ 
			System.out.println("Fehler beim lesen");
		}
		return zeile;
	}
	
	
	//Schließt den Stream zum Zugriff auf die Datei
	public void schliesse()
	{ 
		try
		{ 
			br.close();
		}
		catch (IOException e)
		{  
			System.err.println("Fehler beim lesen");
		}
	}
}


Java:
public class Suche {
	
	String suchwort;
	
	Suche(String suchwort) {
	 this.suchwort = suchwort;
	 //durchsuche(suchwort);
	}
	
	public String durchsuche()
    {
        String ausgabe = "";

        if(this.suchwort.contains(suchwort)) {
        ausgabe = suchwort;
        }
        else {
        	System.out.println("Nicht vorhanden");
        }

        return ausgabe;
    }

}
 

Ark

Top Contributor
Negier mal in Zeile 60 von Start die Aussage wie folgt:
[java=60]while(!zeile.startsWith("</VirtualHost>"));[/code]
Nur geraten, nicht getestet. :D

Ein richtiger XML-Parser wäre eventuell aber auch eine Überlegung wert. (EDIT: Ich sehe gerade, dass es sich hierbei aber gar nicht um XML handelt … bzw. "richtiges" XML.)

Ark
 

Turk66

Mitglied
Vielen dank, ja das habe ich glatt übersehen. Ist wohl immer besser wenn jemand zweites und drittes drüber guckt :D
Nunja ich kriege aber für alle Variablen a, also den Anfangswert.
Dann ist da wohl noch was mit der Zuweisung nicht OK :S
 

Michael...

Top Contributor
Weiss ja nicht wie der Code jetzt aussieht, aber die do... while Schleife bzw. die Abbruchbedingung macht auch nicht viel Sinn ;-) Aber das wurde ja schon erwähnt.

Eventuell liest Du ja jetzt mit einer geänderten Schleife in Zeile 19 bereits die ganze Datei aus.
 

Turk66

Mitglied
Ich will den ServerNamen einer Variable zuweisen (sieht wie folgt aus in der Textdatei):

<VirtualHost 192.168.86.103:80>
ServerName my.test.de
ServerAlias 192.168.86.103
ServerAdmin soc.ce@test.com
DocumentRoot /tmp



Mein JavaCode:

Java:
	zeile = confdatei.liesZeile();
						
	if(zeile.matches("[:space:]* [ServerName] [:space:] [A-Za-z0-9]+")) {
	   serverName = zeile;
        }

Das müsste doch klappen?:S Ich suche nach einen String mit belibiegen leerzeichen, dem Wort
ServerName dann wieder ein Leerzeichen, und dann kann kommen was will.
 

Turk66

Mitglied
Die Methode matches unterstützt doch auch RegEx.
Wie würde es denn aussehen, wenn ich es mit pattern und matcher machen würde?
Habe noch keine Erfahrung mit RegEx.

Danke
 

Turk66

Mitglied
<VirtualHost 192.168.86.103:80>
ServerName my.test.de
ServerAlias 192.168.86.103
ServerAdmin soc.ce@test.com
DocumentRoot /tmp



kannst du mir ein beispielcode geben, wie ich hier den ServerName rausfische?
Vor ServerName sind leerzeichen!
 

Michael...

Top Contributor
Das liese sich - vor allem für Anfänger - recht einfach ohne RegEx lösen.
Aber wenn's unbedingt RegEx sein soll, hier mal ein Ansatz:
Java:
String input = "<VirtualHost 192.168.86.103:80>"
		+ "ServerName my.test.de" 
		+ "ServerAlias 192.168.86.103"
		+ "ServerAdmin [email]soc.ce@test.com[/email]" 
		+ "DocumentRoot /tmp";
Matcher matcher = Pattern.compile("VirtualHost\\s*?(.*?)ServerName\\s*?(.*?)ServerAlias").matcher(input);
while (matcher.find()) {
	System.out.println("Host IP: " + matcher.group(1));
	System.out.println("Name   : " + matcher.group(2));
}
 

Turk66

Mitglied
Noch eine Frage an euch,
wisst Ihr wie ich eine Textdatei von unten aus anfange einzulesen??
Also normalerweise sage Ich dem BufferedReader ja, er soll Sie von oben bis unten zeilenweise
einlesen und ausgeben.
Aber ich will anfangen, die Textdatei von unten aus einzulesen.

Ideen?:S
 
A

aysdf3255

Gast
Aufs letzte Byte positionieren, jeweils rückwärts Byte für Byte lesen.

Die Sinnhaftigkeit sei mal dahingestellt
 

Turk66

Mitglied
Ich habe bereits eine Idee, die ich gerade umsetze.
Ich lasse den BufferedReader bis zum Ende der Datei einlesen, und lasse dabei noch
einen counter durchlaufen der die Zeilen liest.
Dann zieh ich immer eine Zeile ab, und vergleiche ob in der Zeile </VirtualHost> steht.
Wenn ja, soll er sich die Zeile merken.

Also das wäre meine Idee :eek:

Falls Ihr andere Vorschläge habt, immer her damit.
Ich versuche es jetzt mit meiner.
 
G

Gastredner

Gast
Wieso willst du die Datei überhaupt rückwärts einlesen? Wenn es dir dabei nur um die Reihenfolge der Einträge geht, dann wäre es einfacher, nach dem Einlesen der Datei einfach deren Reihenfolge in der Collection, in der du die Einträge speicherst, umzudrehen.
 

Turk66

Mitglied
Das ist nur eine Beispieldatei. Es können 3 oder 4 oder was weiss ich wieviel VirtualHosts vorkommen.
Und zu jedem VirtualHost brauche ich den ServerNamen, DocumentRoot und Proxy.

Ich will dem dann iwie sagen, gebe die Informationen so lange bis zum Ende der Datei aus.
Dann muss ich einfach nur eine while Schleife durchlaufen lassen, bis das Ende der Datei
erreicht ist und das wars.
 
Zuletzt bearbeitet:

Neue Themen


Oben