# Textdatei öffnen, String suchen, String ersetzen ?????????



## chriscool (30. Okt 2003)

Hallo Ihr da draußen,

habe ein Problem. Ich habe eine vordefinierte Textdatei, wo Standarttext sowie §xxx drin enthalten ist. Nun möchte ich aus Java heraus diese Datei X.txt öffnen, nach §xxx suchen und einen anderen Text hinein schreiben!

Kann mir jemand helfen???

Vielen Dank!!!


----------



## gustav (30. Okt 2003)

Versuchs mal damit :

```
public boolean Load(String FileName)
   {
     String buf = null ;
     int Zeile = 1 ;
     boolean back = false ;

     try
     {
       BufferedReader input = new BufferedReader( 
                                new InputStreamReader(
		   	          new FileInputStream(FileName)), 1000) ;

       FileOutputStream Fileoutput = new DataOutputStream(Fileoutput ) ;
  
       while (input.ready() )
       {
         buf = input.readLine() ;

         buf.replaceAll("§xxxx", "XXXXXXX") ;

         // oder ersetzen mit 
         // index = buf.indexOf("§") usw. siehe Java Dokumentation für String
	 
         Zeile++ ;
         outFile.writeBytes(buf +"\n") ;  // weiss jetzt nicht, ob "\n" nötig ist
       }
       input.close() ;
       back = true ;
     } 
    catch (Exception e) 
    {
      System.out.println(e);
      System.out.println("----------------------Exception laden/schreiben!");
      System.exit(1);
    }
    return back ;
   }
```

Das Gerüst müsste soweit klappen, hab es allerdings nur "online" zusammengebastelt....


----------



## chriscool (30. Okt 2003)

Vielen Dank!!!

ich bekommen noch 3 Fehlermeldungen:

Inkompatible Typen; java.io.DataOutputStream wurde gefunden, java.io.FileOutputStream ist
erforderlich

Methode replaceAll in java.lang.String nicht gefunden in Klassse java.lang.String

Variable outFile nicht gefunden


Kannst Du mir da weiterhelfen???


----------



## gustav (30. Okt 2003)

Sorry ich glaube es müsste jetzt so gehen :


```
public boolean Load(String FileName)
   {
     String buf = null ;
     int Zeile = 1 ;
     boolean back = false ;

// ##########
     String writeBack = null ;

     try
     {
       BufferedReader input = new BufferedReader(
                                new InputStreamReader(
                      new FileInputStream(FileName)), 1000) ;

// ########################
      FileOutputStream Fileoutput = new FileOutputStream(FileName) ;
      DataOutput outFile = new DataOutputStream(Fileoutput ) ;
// ########################
 
       while (input.ready() )
       {
         buf = input.readLine() ;

// ##########################
         writeBack = buf.replaceAll("§xxxx", "XXXXXXX") ;

         // oder ersetzen mit
         // index = buf.indexOf("§") usw. siehe Java Dokumentation für String
   
         Zeile++ ;
         outFile.writeBytes(writeBack +"\n") ;  // weiss jetzt nicht, ob "\n" nötig ist
       }
       input.close() ;
       back = true ;
     }
    catch (Exception e)
    {
      System.out.println(e);
      System.out.println("----------------------Exception laden/schreiben!");
      System.exit(1);
    }
    return back ;
   }
```

String replaceAll(String, String) ist allerdings erst ab Java 1.4 verfügbar und benutzt Reguläre Ausdrücke. Falls Du eine ältere Java Version hast, dann must Du erst das Vorkommen Deines Strings suchen (index = buf.indexOf("§xxxx")) und dann entsprechend ersetzten indem Du dir erst den Teil vor "§xxxx" geben lässt buf.subString(0, index), dann ersetzt und dann den Teil nach "$xxxx" anfügst. Geht sicherlich auch noch eleganter, aber das fällt mir jetzt nicht ein.


----------



## Guest (30. Okt 2003)

Oh man. Das ist gut. Vielen Dank. Hab leider nicht die 1.4 Version. 
Deinen Text, wie man es mit älteren Versionen machen könnte, habe ich nicht ganz verstanden. Könntest Du mir das code mäßig zeigen???? Währe echt klasse!!!!


----------



## chriscool (30. Okt 2003)

bin ja kein gast 

Oh man. Das ist gut. Vielen Dank. Hab leider nicht die 1.4 Version. 
Deinen Text, wie man es mit älteren Versionen machen könnte, habe ich nicht ganz verstanden. Könntest Du mir das code mäßig zeigen???? Währe echt klasse!!!!


----------



## gustav (31. Okt 2003)

Also ich dachte mir das so :


```
public class Test
{
  public static void main(String args[])
  {
     String s1 = "beforeFINDafter" ;
     
     int index = s1.indexOf("FIND") ;
     
     String s2 = "error - String not found" ;
     
     if (index > -1)  // found !
     {
       // Teil vorher
       s2 = s1.substring(0, index) ; // Zählung beginnt bei Index 0
       
       // neuen Teil
       s2 = s2.concat(" new ") ;
       
       // Teil dahinter
       s2 = s2.concat( s1.substring(index +4) ) ; // 4 = Länge zu ersetzenden Wortteiles
       
       System.out.println("#" +s2 +"#") ;
     }
  }
}
```

Hier wird aber nur das 1. Vorkommen im String ersetzt, sollte es mehrere solcher Wörter geben mußt Du noch eine while Schleife drum basteln....

Eine vollkommen andere Geschichte aber wahrscheinlich weitaus effektiver ist die Arbeit mit Streams. D.h. normalerweise hast Du einen Eingabe und eine Ausgabestrom die Du nur entsprechend entleeren/füllen mußt. Naja aber so sollte es hoffentlich auch gehen. Vielleicht posted jemand noch eine andere Variante.....


----------

