schnell aus datei lesen

  • Hallo

    Folgendes Java Problem:

    Ich suche in einem File das Byte 0xff. wenn ich auf eines stosse nehme ich mir 4 bytes ab der position und vergleiche sie mit einem bestimmten muster. Wenn es passt ist der algorithmus beendet, wenn nicht dann such ich mir das nächste 0xff und das ganze geht von vorne los bis es passt oder das file durchlaufen wurde.

    Ich mach das zur zeit mit einem RandomAcessFile folgendermassen:

    Das Problem ist dass diese methode verdammt langsam ist. normalerweise wird der frameheader gleich am anfang des Files gefunden, manchmal aber auch erst nacht 30KB oder so. Und für die 30 KB braucht er fast 30 sekunden. Wie macht ihr dass wenn ihr so ein problem habt?

    mfg

  • Lies einen ganzen Block, und checks dann im Speicher durch. Können ruhig so 64k-Blöcke oder größer sein.

    In einen FBO rendern ist wie eine Schachtel Pralinen - man weiß nie, was man kriegt.

  • Jo, dann mach das. Wennst nicht 100 Files im Speicher hältst, oder die Gunkl-CD (die nur aus einem Track besteht) lädst, is der Speicherverbrauch heutzutage eh wurscht.

    In einen FBO rendern ist wie eine Schachtel Pralinen - man weiß nie, was man kriegt.

  • thx wolfi. hat super funktioniert. wenn nur alles so schnell wär wie ein RAM ;)

    Falls mal wer ein änliches problem hat, hier ist der code:

  • Interressant. Ich hab mir jetzt nicht so angeschaut was beat in seinem code so alles macht, aber so wuerd ich den ersten Frameheader mit einem Ruby script rausfischen:

    Code
    def first_frameheader bytes
      start = bytes.index(0xff)
      bytes[start..start+4].unpack("B8B8B8B8")
    end

    Hier ein Beispielprogramm:

    Code
    p first_frameheader(ARGF.read)

    Beispiel Aufruf:
    cat heroes.mp3 | ruby print_first_frameheader.rb

    Beispiel Ausgabe:
    ['11111111', '11111011', '10110000', '00000100']


    Hab das mal mit ein paar files getestet und das output scheint mir korrekt zu sein.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!