[Java]Performant Datei durchsuchen

xriz

Cadet 4th Year
Registriert
Sep. 2002
Beiträge
111
Weiß jemand mit welchen Klassen ich eine Binär-Datei (mp3) am besten nach einer Zeichenkette durchsuchen kann?

ein etwas hilfloser und nicht sehr schneller Ansatz von mir:
Leider klappt das bei großen Files(70MB) nicht mehr.

Code:
private int testFile(File f)    
{      
  int pos = -1;      
  try {        
    RandomAccessFile rf = new RandomAccessFile(f, "r");        
    byte[] b = new byte[(int)rf.length()];        
    rf.readFully(b);            
    String s = new String(b);          
    pos = s.indexOf("<U>tag");       
    rf.close();      
  } catch (Exception ex) {}        
  return pos;    
}
 
wenn ich das richtig sehe ließt du erst das gesamte file in den arbeitsspeicher. das muss ja nicht sein. ließ einfach in einer schleife zeichen für zeichen, und vergleiche dieses mit dem ersten buchstaben der gesuchten zeichenkette. bei übereinstimmung vergleichst du das nächste usw.
bei selbstähnlichen suchstrings musst du auch bei jedem übereinstimmenden zeichen auch wieder mit dem ersten vergleichen, sonst übersiehst du unter umständen den suchstring!
wenn die zeichenkette gefunden wurde wird der lesevorgang ggf. abgebrochen.
 
Ich weiß zwar keine Lösung für dich, aber ich kann dir sagen, was der große Fehler deiner Lösung ist.

Du kopierst die gesammte Datei zur Laufzeit in den Hauptspeicher. Das ist sehr böse :eek:.

Ich glaube aber du solltest dir mal die Klasse FileInputStream anschauen.
 
hab grad mal nachgesehen, hab noch alte skripte von einer informatik-vorlesung. da sind verschiedene suchverfahren beschrieben. wenn du interesse hast, dann kann ich sie dir zumailen! :)
 
Das wär echt nicht schlecht. Meine EMail Adresse ist: chris22_@gmx.de
Wird da zufällig auch beschrieben wie man am besten Binärdateien bearbeitet?
Eigentlich will ich nur bestimmte Teile aus der Datei ausschneiden bzw überschreiben.
 
Hab das skript mal angesehen. Da wird leider nur auf diverse Suchalgorithmen eingegangen, aber nicht auf Java. Dafür hilft mir das Java-Buch von Guido Krüger weiter
 
naja, dort sind die algorithmen beschrieben, aber implementieren musst du die schon selbst ;). aber vielleicht gibts ja auch ne passende klassenbibliothek dazu.
 
Ich habe das ganze jetzt so gelöst. Alles mit RandomAccessFiles.

Code:
int pos = -1;
String search = "<U>tag";
RandomAccessFile rf = new RandomAccessFile(f, "r");       
byte[] b = new byte[1024];        
int offset = 0;          
while (rf.read(b,0,b.length) > 0) {          
  String s = new String(b);         
  pos = s.indexOf(search);          
  if (pos != -1) {            
    pos += offset;            
    break;          
  }          
  offset += b.length-search.length();          
  rf.seek(offset);        
}        
rf.close();
return pos;
 
Zurück
Oben