Java String mit Platzhalter durchsuchen

Ich finde keinen Fehler, warum er nicht null schreiben sollte.

Du setzt text = "". Immer.
while ((line = input.readLine()) != null) {
text = text + '\n' + line;
}

Wenn line == null ist*, dann hast du

text = "" + "\n" + "null";


Die bekommst du dann auch ausgegeben, deine null im Text.Also lieber noch ne If Abfrage einbauen.


Das war doch jetz dein Problem? oder

edit:* \n oder \r erfasst er nicht. Ist nun eine Zeile nur mit \n oder \r, dann ist nicht das Ende des Streams erreicht, ... aber die line auch leer.
 
Zuletzt bearbeitet:
Das Ende kommt näher :D

Ich habe noch ein Problem mit dem StringTokenizer:

Code:
    StringTokenizer st = new StringTokenizer(text);
    int n = 0;
    while(st.hasMoreTokens())
    {
        if(st.nextToken().contains("fehlgeschlagen."))
        {
        	
            n++;
            st.nextToken();
            
        }
        
    }
    System.out.println(fileArray[i]);
    System.out.println("In der Datei ist das Wort  " + n + " mal enthalten");
    [B]n = 0;[/B]

Er zählt auch sauber hoch, nur wird die Variable n nicht mehr initalisiert nach dem durchlaufen der Schleife.

Meine Ausgabe sieht folgenermaßen aus:

C:\Logs\Upd-2010-09-16-14-00-33.log
In der Datei ist das Wort 0 mal enthalten
C:\Logs\Upd-2010-12-03-08-24-22.log
In der Datei ist das Wort 0 mal enthalten
C:\Logs\Upd-2011-07-25-07-43-30.log
In der Datei ist das Wort 7 mal enthalten
C:\Logs\Upd-2011-07-25-09-42-34.log
In der Datei ist das Wort 7 mal enthalten
C:\Logs\Upd-2011-07-25-11-42-34.log
In der Datei ist das Wort 7 mal enthalten
C:\Logs\Upd-2011-07-25-13-42-34.log
In der Datei ist das Wort 7 mal enthalten
C:\Logs\Upd-2011-07-26-07-43-53.log
In der Datei ist das Wort 14 mal enthalten
C:\Logs\Upd-2011-07-26-09-41-22.log
In der Datei ist das Wort 14 mal enthalten
C:\Logs\Upd-2011-07-26-11-41-19.log
In der Datei ist das Wort 14 mal enthalten
C:\Logs\Upd-2011-07-26-13-41-20.log
In der Datei ist das Wort 14 mal enthalten
C:\Logs\Upd-2011-07-27-07-39-58.log
In der Datei ist das Wort 21 mal enthalten
C:\Logs\Upd-2011-07-27-09-37-03.log
In der Datei ist das Wort 21 mal enthalten
C:\Logs\Upd-2011-07-27-11-37-03.log
In der Datei ist das Wort 21 mal enthalten
C:\Logs\Upd-2011-07-27-13-37-03.log
In der Datei ist das Wort 21 mal enthalten
C:\Logs\Upd-2011-07-28-07-45-08.log
In der Datei ist das Wort 28 mal enthalten
C:\Logs\Upd-2011-07-28-09-42-19.log
In der Datei ist das Wort 28 mal enthalten
C:\Logs\Upd-2011-07-28-11-42-24.log
In der Datei ist das Wort 28 mal enthalten
C:\Logs\Upd-2011-07-28-13-42-25.log
In der Datei ist das Wort 28 mal enthalten
C:\Logs\Upd-2011-07-29-07-50-53.log
In der Datei ist das Wort 35 mal enthalten

Ich wollte eigentlich für jede Datei die Anzahl einzeln haben und dann noch ein IF einbauen mit Wenn größer als 0, dann Aktion. Allerdings ist das ja so nicht möglich.

Ich befürchte ich sehe den Wald vor Bäumen nicht :D
 
Ich vermute mal, dass du den zu lesenden Text nicht leerst.
Nach n = 0 musst du natürlich auch text = "" setzen, denn ansonsten wird der Inhalt der Dateien verkettet. ;)


Code:
                    StringTokenizer st = new StringTokenizer(text);
                    int n = 0;
                    while (st.hasMoreTokens()) {
                        if (st.nextToken().contains("fehlgeschlagen.")) {
                            n++;
                            st.nextToken();
                        }
                    }
                    System.out.println("In der Datei ist das Wort " + n + " mal enthalten");
                    n = 0;
                    text = "";

Das st.nextToken() in der while-Schleife ist übrigens überflüssig.
 
Zuletzt bearbeitet:
Hätte ich auch selbst draufkommen können... jetzt kämpfe ich erstmal mit dem WindowBuilder :D

Eine letzte Frage habe ich noch:

Ich habe mir mti dem WindowBuilder eine GUI zusammengebaut mit Buttons um die Methoden usw. aufzurufen, nur bekomme ich ein mein Textfeld nciht den Output rein.

Ich habe jetzt viel gelesen mit Printstream umleiten usw. aber wie funktioniert das jetzt genau?

Leite ich im jText Quellcode den System.out.println Stream irgendwie um, oder gibt es eine elegantere Möglichkeit.
Ein Return Wert wäre auch nicht schlecht, allerdings bei meinem Programm ohne zusätzlichen Array nicht zu bewerkstelligen, oder täusche ich ich da?
 
Zuletzt bearbeitet:
Was willst du denn mit PrintStream? Irgendwo in deinem Programm werden die eingelesenen Zeilen doch als String rumgeistern. Nimm diese entsprechenden Strings und schieb sie mit textFeld.setText(String str) ins Textfeld.

Gruß Timo
 
Richtig, mit setText(String str).

Aber wäre eine JTextArea nicht sinniger, wenn du alles auf mal ausgeben willst?

Und wenn du alles auf mal ,,reinschieben'' willst, dann leg dir vorher einen String an (vor der Schleife) und füge deinen text-String am Ende der Schleife immer hinzu.
Wenn dann alle Daten eingelesen wurden, packste das ins JTextArea und gut.

Wobei bei du auch die .append-Methode von JTextArea nehmen könntest. Würdest dir den extra String sparen. (würde es dann so machen!)

Am besten noch JTextArea.setLineWrap(true), damit du auch nicht über den Rand schreiben kannst.

http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/JTextArea.html#append(java.lang.String)
http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/JTextArea.html#setLineWrap(boolean)
 
Zuletzt bearbeitet: (URL korrigiert.)
Also es sieht so aus:

Code:
package package_001;


import java.io.*;
import java.util.StringTokenizer;
import java.io.File; 

public class  Einlesen{
public static void main (String[] args) throws IOException{



String text = "";

try 
{
	
	File f = new File("C:/Logs");
	File[] fileArray = f.listFiles();	
	int Size = fileArray.length;
	
	
	
	for (int i=0;i<Size;i++)
	{
//		System.out.println(i);
//		System.out.println(fileArray[i]);
		int bufferSize = 40240;
		BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(fileArray[i]), "UTF-16"), bufferSize);
		String line;

		while ((line = input.readLine()) != null) {
//    		System.out.println(input.readLine());
			text = text + '\n' + line;
		}
    if (text.endsWith("\n"))
        text = text + "\n";

    input.close();
    
    StringTokenizer st = new StringTokenizer(text);
    int n = 0;
    while(st.hasMoreTokens())
    {
        if(st.nextToken().contains("fehlgeschlagen."))
        {
        	
            n++;
            st.nextToken();
            
        }
        
    }
    if (n>0)
    {
    	[B]System.out.println(fileArray[i]);[/B]
//   	System.out.println("In der Datei ist das Wort  " + n + " mal enthalten");
    	[B]System.out.print("Dieses Update ist fehlgeschlagen!");[/B]
//    	text = "";
    	n = 0;
    }
    
    else 
    	
    	text = "";
    	n = 0;
   

   
  
    System.out.println(text);
    text = "";
    
    
}} catch (FileNotFoundException ex) {
    ex.printStackTrace();
}  catch (IOException ex) {
    ex.printStackTrace();
}
//System.out.println(text);



}


}

die beiden fetten Werte will ich ausgeben in der JTextArea.
 
Code:
    if (n>0)
    {
    	System.out.println(fileArray[i]);
//   	System.out.println("In der Datei ist das Wort  " + n + " mal enthalten");
    	System.out.print("Dieses Update ist fehlgeschlagen!");
//    	text = "";
    	n = 0;
    }
    
    else 
    	
    	text = "";
    	n = 0;


    System.out.println(text);
    text = "";


Kannst du kürzen nach :
Code:
    if (n>0)
    {
    	System.out.println(fileArray[i]);
//   	System.out.println("In der Datei ist das Wort  " + n + " mal enthalten");
    	System.out.print("Dieses Update ist fehlgeschlagen!");

    }
    text = "";
    n=0;

Du setzt in beiden Abzweigungen n=0. Also kann es auch danach folgen.
Du setzt in beiden Abzweigungen text = "";. Also kann es auch danach folgen.
Du gibst immer einen leeren Text aus, da du ja text = ""; setzt.

Deine else ist auch nicht korrekt, da ohne {} nur die nächste Anweisung ausgeführt wird, kein CodeBlock! (Hab ich schon mal erwähnt)! D.h. n=0 hättest du da immer gemacht, auch, wenn du in der if drin gewesen wärst und das hätte n nicht auf 0 gesetzt.

Du hast sogar noch eine IF drin, wo du sie auch nicht hingeschrieben hast. Gut, dass da nur eine Anweisung drauf folgt.

---------------------------

Code:
int Size = fileArray.length;

	
	for (int i=0;i<Size;i++){
                    ......
        }

Machst du:
Code:
	for (int i=0;i<fileArray.length;i++){
                    ......
        }
Spart dir eine Variable, schadet der Übersicht nicht und Variablen schreibt man am Anfang klein, außer es sind Konstante. (final ist nicht gleich Konstant in Java, tut man dann aber trotzdem).
 
Zuletzt bearbeitet:
Ja optimiert habe ich es gerade, der Print von text ist auch immer auskommentiert der steht nur noch zu Debug Zwecken drin. Das einzige was mich interessiert ist ob n>0 (dann ist das Update von Avira fehlgeschlagen) und dann die Ausgabe des Dateinamens durch System.out.println(fileArray) und der Meldung " Dieses Update ist fehlgeschlagen". Diese beiden Fetzen will ich in meiner GUI ausgeben.

Oder gibt es eine Möglichkeit die Eclipse Konsole in der dann kompilierten jar Datei auszugeben?
 
Wenn du ein GUI hast, was ein JTextArea oder JTextField hat, dann kannst du die doch, wie oben schon angeschnitten, füllen.

Die Eclispe Konsole ist quasi deine Systemkonsole.
Starte das Javaprogramm mal über die Windowskonsole... ;)
 
Zurück
Oben