RandomAccessFile - Bestimmte Filesize begrenzen

Iron Monkey

Bekanntes Mitglied
Hi an alle!

Ich habe eine Klasse, mit der ich die Möglichkeit habe, die Anzahl der ersten Zeilen löschen zu können, z.B.

ich möchte die ersten 5 Zeilen löschen. Siehe unten den Source-Code:

Mein Wunsch ist, wie kann die Anzahl der Zeilen ermitteln, wenn ich die txt-Datei auf 50 MB begrenzen möchte und meine txt-Datei ist z.B. 160 MB groß? Ich will die Anzahl der Zeilen nicht selber bestimmen, sondern es soll ja durch die Datei-Größe berechnet werden oder habt ihr vielleicht eine andere Idee! Die Text-Datei sieht so aus:

04.10.2010 08:13:43 User[ 1943 ] CommandoGroup[ 0x0003 ] Commando[ 0x0015 ]
04.10.2010 08:13:45 User[ 1943 ] CommandoGroup[ 0x000B ] Commando[ 0x018F ]
04.10.2010 08:13:45 User[ 1943 ] CommandoGroup[ 0x000B ] Commando[ 0x018C ]


Nach dem Löschen darf es nicht so aussehen, sondern entweder komplette Zeile oder gar nichts löschen:
doGroup[ 0x0003 ] Commando[ 0x0015 ]
04.10.2010 08:13:45 User[ 1943 ] CommandoGroup[ 0x000B ] Commando[ 0x018F ]
04.10.2010 08:13:45 User[ 1943 ] CommandoGroup[ 0x000B ] Commando[ 0x018C ]

Man kann ja per Schleife jede Zeile durchgehen und nach der Schleife mit randomAccessFile.getFilePointer() die Größe ermitteln! Da komme ich irgendwie nicht weiter!

Java:
package File;

import java.io.*;

public class FileContentDelete {

	public FileContentDelete()
	{
        RandomAccessFile randomAccessFile = null;

		try
		{
			randomAccessFile = new RandomAccessFile( "Protokoll.txt", "rw" );

			if( randomAccessFile.length() == 0 )
				return;
			
			int numberOfLinesToBeSkipped = 5;
			
			for (int i = 0; i < numberOfLinesToBeSkipped; i++)
			    System.out.println("Skipping: " + randomAccessFile.readLine());


			long sourcePosition 		= randomAccessFile.getFilePointer();
			long originalLengthInBytes 	= randomAccessFile.length();
			long maxLength 				= originalLengthInBytes - sourcePosition;
			long destinationPosition 	= 0;

			byte[] buffer = new byte[65535];
			
			moveContent( randomAccessFile, sourcePosition, destinationPosition, maxLength, buffer );
			
			randomAccessFile.setLength( maxLength );
		}
		catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		catch (IOException e) {
			e.printStackTrace();
		}
		finally
		{
			if( randomAccessFile != null )
			{
				try
				{
					randomAccessFile.close();
				}
				catch (IOException e) {
					e.printStackTrace();
				}

				randomAccessFile = null;
			}
		}
	}

	public static void main(String[] args) {
		new FileContentDelete();
	}
	
	private static void moveContent( RandomAccessFile randomAccessFile, long sourcePosition, long destinationPosition, long lengthInBytes, byte[] buffer )
	{
        int currentByteCount = 0;
        int bytesRead = 0;
        int bytesWritten = 0;
 
        long currentSourcePosition = sourcePosition;
        long currentDestinationPosition = destinationPosition;
 
        try
        {
			randomAccessFile.seek(currentSourcePosition);
			
	        do
	        {
	            randomAccessFile.seek( currentSourcePosition );
	            currentByteCount = randomAccessFile.read( buffer );
	            bytesRead += currentByteCount;

	            if (bytesRead > lengthInBytes)
	                currentByteCount = ((int) lengthInBytes) - bytesWritten;

	            bytesWritten += currentByteCount;

	            randomAccessFile.seek( currentDestinationPosition );
	            randomAccessFile.write( buffer, 0, currentByteCount );

	            currentSourcePosition += currentByteCount;
	            currentDestinationPosition += currentByteCount;
	            randomAccessFile.seek( currentSourcePosition );
	        }
	        while (bytesWritten < lengthInBytes);
		}
        catch (IOException e) {
			e.printStackTrace();
		}
    }
}

Gruß
Iron Monkey
 

Sneek

Aktives Mitglied
Hm, also ich hab gerade mal probiert, wenn deine Zeilen immer die Form haben, wächst die echte Dateigröße pro Zeile immer um ungefähr 75-79 Bytes, also könntest du da ungefähr ausrechnen, wann 50 MB erreicht werden. Ist es wichtig, dass die Datei genau 50 MB groß ist?

Ein Problem könnte evt. sein, dass die größe auf dem Datenträger ja alle 4KB wächst, ich weiss nicht welchen Wert Java auslesen kann, die tatsächliche Größe oder die Größe auf dem Datenträger, müsstest du mal probieren.

lg
 

Iron Monkey

Bekanntes Mitglied
Hm, also ich hab gerade mal probiert, wenn deine Zeilen immer die Form haben, wächst die echte Dateigröße pro Zeile immer um ungefähr 75-79 Bytes, also könntest du da ungefähr ausrechnen, wann 50 MB erreicht werden. Ist es wichtig, dass die Datei genau 50 MB groß ist?

Ein Problem könnte evt. sein, dass die größe auf dem Datenträger ja alle 4KB wächst, ich weiss nicht welchen Wert Java auslesen kann, die tatsächliche Größe oder die Größe auf dem Datenträger, müsstest du mal probieren.

lg

Also, es muss nicht genau 50 MB groß sein, aber gut, die Textlänge jeder Zeile ist nicht immer gleich! Der Inhalt der Datei soll nur nicht die Grenze überschreiten, d.h. wenn der Inhalt ca. 49 MB groß ist, dann ist es ja super! Java kann die tatsächliche Größe auslesen. Das kann man bei randomAccessFile.length(); sehen.

Der Text wird ständig zeilenweise in die txt-Datei geschrieben, ich will auch nicht lesen ( Das interessiert mich nicht! ;) ) und die Dateigröße wächst ja immer größer. Deswegen muss ich die festgelegte Max-Datei-Größe prüfen und wenn sie überschritten wurde, dann soll der alte Text von oben gelöscht werden, da die Neuen immer am Ende gefüllt werden quasi LIFO -> Last In, First out

Hast du vielleicht eine Idee, wie ich das am besten und am effektivsten realisieren kann? Das Problem ist ja, dass die Datei wahnsinnig groß ist, um den Text zeilenweise zu löschen! Ich meine damit von der Performance her. Es muss ja schnell gehen, dass der Anwender nix von merkt!

Gruß
Iron Monkey
 

Sneek

Aktives Mitglied
Hm, was schnelles und effektives fällt mir nur ein wenn die Textzeilen ungefähr gleich lang sind, da könntest du ja aus Gesamtgröße, den 50 MB und den 75-79 Bytes eine ungefähre Schleifenzählvariable berechnen, die auch gleichzeitig die Anzahl der Zeilen ist die gelöscht werden müssen.

Aber so fällt mir nichts weiter ein, als alle paar Löschvorgängen zu testen, wie groß die Datei gerade ist....
 

Iron Monkey

Bekanntes Mitglied
Hm, was schnelles und effektives fällt mir nur ein wenn die Textzeilen ungefähr gleich lang sind, da könntest du ja aus Gesamtgröße, den 50 MB und den 75-79 Bytes eine ungefähre Schleifenzählvariable berechnen, die auch gleichzeitig die Anzahl der Zeilen ist die gelöscht werden müssen.

Aber so fällt mir nichts weiter ein, als alle paar Löschvorgängen zu testen, wie groß die Datei gerade ist....

OK danke für die Tipps bzw. Vorschläge! Dann muss ich mir was anderes einfallen lassen! ;)

Gruß
Iron Monkey
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S RandomAccessFile durch bytearrayinputstream ersetzen Allgemeine Java-Themen 4
A RandomAccessFile.read(byte[] b) Allgemeine Java-Themen 9
A RandomAccessFile - "insert" implementieren? Allgemeine Java-Themen 4
H RandomAccessFile - Zeile finden Allgemeine Java-Themen 5
C RandomAccessFile aus Jar Allgemeine Java-Themen 7
T Mit Applet per RandomAccessFile Datei öffnen Allgemeine Java-Themen 3
reibi RandomAccessFile Puffer schreiben Allgemeine Java-Themen 2
J RandomAccessFile readLine(); Allgemeine Java-Themen 5
R RandomAccessFile springt zum Ende Allgemeine Java-Themen 11
P Nochmal RandomAccessFile Allgemeine Java-Themen 6
N RandomAccessFile überschreibt Inhalt Allgemeine Java-Themen 3
A RandomAccessFile - Bytes vom Anfang der Datei löschen Allgemeine Java-Themen 32
B Probleme mit RandomAccessFile Allgemeine Java-Themen 3
R Knacken bei RandomAccessFile Allgemeine Java-Themen 5
K RandomAccessFile und readUTF/writeUTF Allgemeine Java-Themen 4
T RandomAccessFile im .jar Allgemeine Java-Themen 2
M RandomAccessFile Allgemeine Java-Themen 10
JavaJakob22 Bestimmte HashMap importieren Allgemeine Java-Themen 4
L Classpath Zur Laufzeit bestimmte Klassen in Classloader hinzufügen? Allgemeine Java-Themen 4
C Aus MEHREREN Excel Tabellen bestimmte Zelle addieren Allgemeine Java-Themen 1
J Eine bestimmte Zahl im Integer ändern Allgemeine Java-Themen 9
J Bestimmte Zeile aus Textdatei auslesen Allgemeine Java-Themen 18
C Eclipse einstellen, dass eine bestimmte JDK benutzt werden soll Allgemeine Java-Themen 3
KeVoZ_ Bestimmte Zeile aus Console finden & auslesen Allgemeine Java-Themen 2
A Bestimmte Inhalte aus ArrayList 1 in ArrayList 2 kopieren Allgemeine Java-Themen 6
N Input/Output Website Text auslesen und bestimmte Zeilen wiedergeben Allgemeine Java-Themen 4
K Apache POI Word bestimmte Textstellen bearbeiten Allgemeine Java-Themen 1
H Bestimmte Aufgaben zur bestimmter Zeit/ in bestimmten Intervallen Allgemeine Java-Themen 3
X Schauen ob eine bestimmte .exe geöffnet ist Allgemeine Java-Themen 7
J Bestimmter Buchstabe = bestimmte Zahl Allgemeine Java-Themen 10
Minonos Einem Programm Zugriff auf bestimmte Ordner geben Allgemeine Java-Themen 5
A Bestimmte Sonderzeichen im Regulären Ausdruck Allgemeine Java-Themen 2
C Input/Output Bestimmte Zeile in Datei ändern. Allgemeine Java-Themen 13
R Bestimmte Tasten abgreifen Allgemeine Java-Themen 3
aze JUnit: Testen ob bestimmte Exception nicht auftritt Allgemeine Java-Themen 18
H2SO3- bestimmte class immer mit 1.4 compilieren Allgemeine Java-Themen 5
S Aus einer Liste<Oberklasse> alle Elemente die eine bestimmte Unterklasse von Oberklasse haben filter Allgemeine Java-Themen 8
D prüfen, ob Enums bestimmte Elemente enthalten Allgemeine Java-Themen 3
L Programm um eine bestimmte Uhrzeit ausführen Allgemeine Java-Themen 4
M Security Manager für bestimmte Klassen/Classloader? Allgemeine Java-Themen 3
E Wie Arraylisten auf bestimmte Art durchlaufen? Allgemeine Java-Themen 3
X Codeabarbeitung innerhalb des Hauptprogramms für bestimmte Zeit unterbrechen Allgemeine Java-Themen 2
J Mit Scanner-Klasse eine Datei zeilenweise einlesen und nur bestimmte Zeichen abfragen Allgemeine Java-Themen 11
S Java Excel bestimmte Zellen auslesen (POI HSSF) Allgemeine Java-Themen 11
S bestimmte Strings spliten! Allgemeine Java-Themen 7
G bestimmte Files suchen Allgemeine Java-Themen 2
A Bestimmte JVM verwenden Allgemeine Java-Themen 13
A bestimmte Zeichen aus einem String auslesen Allgemeine Java-Themen 2
L Wie für ein bestimmte JVM-Version kompilieren? Allgemeine Java-Themen 2
I Thread eine bestimmte Zeit zur Ausführung geben Allgemeine Java-Themen 2
P JSlider nur bestimmte werte geben Allgemeine Java-Themen 2
D Programmunterbrechung für eine bestimmte Zeit (Millisikunden Allgemeine Java-Themen 10
M JTextPane Mausklick auf bestimmte Wörter startet Aktion Allgemeine Java-Themen 8
T Bestimmte bytes in einer Datei ersetzen? Allgemeine Java-Themen 4
D Vektor - bestimmte Werte auslesen. Allgemeine Java-Themen 3
A bestimmte Taste an Server verschicken Allgemeine Java-Themen 11
G Einem Programm eine bestimmte Rechenzeit zuteilen Allgemeine Java-Themen 3
8 Programme für bestimmte Dateitypen finden Allgemeine Java-Themen 6
S Bestimmte Tasten mit der Robot Klasse? Allgemeine Java-Themen 4
G Bestimmte Dateien aus Verzeichnis löschen Allgemeine Java-Themen 5
G Nur bestimmte Variablen einer Klasse übernehmen Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben