# Zeichen aus einer Datei löschen



## RealbigZ (11. Oktober 2005)

Hallo!
Ich möchte eine Zeile aus einer Datei löschen. Folgender Quelltext hat sich nun daraus ergeben:


```
public class Access
 {
	public static void main(String[] args) {
		new Access();

	}
	
	private static String file="data.txt"; 
	private static RandomAccessFile wData=null;
	
	public Access()
	{
		save("a123456789");
		save("b123456789");
		save("c123456789");
		save("d123456789");
		save("e123456789");
		
		delLine(1);
	}
	
	public static void save(String data)
	{
		try
		{
			wData=new RandomAccessFile(file,"rw");
			
			if(wData!=null)
			{
				try
				{
					wData.seek(wData.length());
					wData.writeBytes(data+"\n");
				}
				catch (IOException e)
				{
					e.printStackTrace();
				}
			}
			else System.out.println("Error: Öffnen des Streams fehlgeschlagen.");
		}
		catch (FileNotFoundException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try { wData.close(); }
			catch (IOException e) { e.printStackTrace(); }
		}
	}
	public static void delLine(int index)
	{
		int strLen=11;
		
		try
		{
			wData=new RandomAccessFile(file,"rw");
			
			if(wData!=null)
			{
				try
				{
					wData.seek((index*strLen));
					for(int i=0;i<strLen;i++)
					{
						wData.write('\0');
					}
				}
				catch (IOException e)
				{
					e.printStackTrace();
				}
			}
			else System.out.println("Error: Öffnen des Streams fehlgeschlagen.");
		}
		catch (FileNotFoundException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try { wData.close(); }
			catch (IOException e) { e.printStackTrace(); }
		}
	}
}
```

Soweit funktioniert das auch wie ich es mir gedacht habe, nur das die Zeichen nicht gelöscht, sondern mit NULL überschrieben werden. Aber egal was ich write() gebe, sämtliche Steuerzeichen habe ich schon ausprobiert. Die Zeichen werden immer nur überschrieben jedoch nicht gelöscht.


----------



## Billie (11. Oktober 2005)

Hm, auch schon mit einem leeren String versucht? new String("")


----------



## RealbigZ (11. Oktober 2005)

Ja habe ich. Wie gesagt, fast alles. Ich glaube es geht nicht einfach zu überschreiben.
Aber es muss einen Weg geben, ausser die ganzen Daten zu kopieren und nur die Zeile weg zulassen, die Raus soll. Das ist performance mässig viel zu aufwändig.


----------



## javaprogger1987 (12. Oktober 2005)

Also ich kenne keinen Weg das anders zu machen, weil das soweit ich weiß auch unter C++ (Die write()-Methode ist in C++ geschrieben) nicht anders geht, ohne denn Rest zu kopieren.. Ich guck noch mal ob ich was finde wenn nicht musst du es vermutlich so oder so ä. lösen:


```
public static void delLine( int index ) 
   {
	 int strLen = 11;
 
	 try 
	 {
	   wData = new RandomAccessFile( file, "rw" );
	   wRead = new RandomAccessFile( file, "r" );
	   if ( wData != null ) 
	   {
		 try 
		 {
		   wData.seek( ( index * strLen ) );
		   wRead.seek( ( index * strLen ) + strLen );
		   
		   byte[] data = new byte[4096];
		   int len = -1;
		   
		   while ( (len = wRead.read( data ) ) > -1 )
		   {
			 wData.write( data, 0, len );
		   }
		 }
		 catch ( Exception e ) {
		   e.printStackTrace();
		 }
	   }
	   else
		 System.out.println( "Error: Öffnen des Streams fehlgeschlagen." );
	 }
	 catch ( FileNotFoundException e ) 
	 {
	   e.printStackTrace();
	 }
	 finally 
	 {
	   try 
	   {
		 wData.setLength( wData.length() - strLen );
		 wData.close();
		 wRead.close();
	   }
	   catch ( IOException e ) 
	   {
		 e.printStackTrace();
	   }
	 }
   }
```
Von der Performance her sollte das eigentlich ganz ok sein, wenn die Dateien jetzt nicht gerade super groß sind..


----------

