1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

schnell aus datei lesen

  • beat
  • 24. August 2007 um 00:15
  • Unerledigt
  • beat
    14
    beat
    Mitglied
    Reaktionen
    2
    Punkte
    2.007
    Beiträge
    338
    • 24. August 2007 um 00:15
    • #1

    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:

    Code
    private void getFirstFrameHeader() throws NoFrameHeaderFoundException {
    
    
            // Instantitate a Random Access File with read rights
    
            RandomAccessFile raf = null;
    
            try {
    
                raf = new RandomAccessFile(this,"r");
    
            } catch (FileNotFoundException e) {
    
                System.out.println("File not found");
    
            }
    
            boolean headerFound = false;
            boolean endOfFile = false;
    
            /*
             * Should be changed due to perfomance problems
             */
            long positionInFile = 0;
    
            /*
             * Checks every Byte if it is equal to 0xff as long as
             * a valid header isnt found or the end of file is reached
             */
    
            while (!headerFound && !endOfFile) {
    
    
                try {
    
    
                    raf.seek(positionInFile);
    
    
                } catch (IOException e1) {
    
    
                    System.out.println("Couldn't point to file Position\n" + e1);
    
    
                }
    
    
                int read = 0;
                int readPlusOne = 0;
                int readPlusTwo = 0;
                int readPlusThree = 0;
    
    
                try {
                    read = raf.read();
    
    
                    readPlusOne = raf.read();
                    readPlusTwo = raf.read();
                    readPlusThree = raf.read();
    
    
                } catch (IOException e) {
    
    
                    System.out.println("IO Exception");
    
    
                }
    
    
                // Break if end of file is reached
    
    
                if (read == -1 || readPlusOne == -1 || readPlusTwo == -1
                        || readPlusThree == -1) {
                    endOfFile = true;
                    break;
                }
    
    
                // If actual Byte equals 0xff
    
    
                if (read == 255) {
    
    
                    // check if the next 3 Bytes could form a valid header or not
    
    
                    if (isHeader(readPlusOne, readPlusTwo, readPlusThree)) {
                        firstFrameHeader = "11111111"
                                + JTaggerUtils.intArrayToString(JTaggerUtils
                                        .getBits(readPlusOne))
                                + JTaggerUtils.intArrayToString(JTaggerUtils
                                        .getBits(readPlusTwo))
                                + JTaggerUtils.intArrayToString(JTaggerUtils
                                        .getBits(readPlusThree));
                        headerFound = true;
                    }
                }
    
    
                positionInFile++;
    
    
                System.out.println(positionInFile); // debug
    
            }
    
            startPosOfFirstFrameHeader = --positionInFile;
            try {
    
                raf.close();
    
            } catch (IOException e) {
    
                e.printStackTrace();
            }
    
            if (!headerFound)
                throw new NoFrameHeaderFoundException("No Frame header found in "
                        + this.getName());
        }
    Alles anzeigen

    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

    Visit: http://itunes.apple.com/de/artist/cbh-mobile/id338117761

  • Wolfibolfi
    37
    Wolfibolfi
    Mitglied
    Reaktionen
    186
    Punkte
    14.936
    Beiträge
    2.942
    • 24. August 2007 um 00:19
    • #2

    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.

  • beat
    14
    beat
    Mitglied
    Reaktionen
    2
    Punkte
    2.007
    Beiträge
    338
    • 24. August 2007 um 00:23
    • #3

    das hab i ma auch scho überlegt, allerding gleich das ganze mp3 da würd ma sich nämlich im vergleich zu den blöcken arbeit ersparen (wenn zb oxff am ende des block gefunden wird und man dann einen neuen einlesen muss für die anderen 3 bytes)

    Visit: http://itunes.apple.com/de/artist/cbh-mobile/id338117761

  • Wolfibolfi
    37
    Wolfibolfi
    Mitglied
    Reaktionen
    186
    Punkte
    14.936
    Beiträge
    2.942
    • 24. August 2007 um 10:07
    • #4

    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.

  • beat
    14
    beat
    Mitglied
    Reaktionen
    2
    Punkte
    2.007
    Beiträge
    338
    • 24. August 2007 um 16:24
    • #5

    thx wolfi. hat super funktioniert. wenn nur alles so schnell wär wie ein RAM :winking_face:

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

    Code
    private void getFirstFrameHeader() throws NoFrameHeaderFoundException {
    
    
            // Neuen RAF initialisieren
    
            RandomAccessFile raf = null;
    
            try {
    
                raf = new RandomAccessFile(this,"r");
    
            } catch (FileNotFoundException e) {
    
                System.out.println("File not found");
            }
    
            /*
             * Im Speicher werden 65536 Bytes für blöcke aus
             * dem File reserviert die dann mit dem muster
             * byteweise verglichen werden.
             */
    
            byte byteBlock[] = new byte[65536];
    
            /*
             * BlockCounter zählt wieviel blöcke schon gelesen
             * werden und dient grundsätzlich zur positionsberechnung
             * des Zeigers.
             */
    
            long blockCounter = 0;
    
            /*
             * Wenn der header gefunden wurde wird die schleife verlassen
             */
    
            boolean headerFound = false;
    
    
            try {
    
                // lesen des ersten blockes
    
                raf.read(byteBlock);
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
    
            /*
             * Solange kein Header gefunden wurde wird der ByteBlock byteweise
             * durchlaufen und geprüft ob es sich bei byte[i] + die nächsten 3
             * Bytes um einen gültiogen Header Handeln kann. Ist dies der Fall
             * wird die Schleife verlassen. Wenn nicht wird bis zum ende des
             * Blockes weitergesucht. Da die letzten 3 Bytes nicht geprüft werden
             * können (da ja noch kein neuer Block von der HD gelesen wurde werden
             * die letzten 3 Bytes einfach beim neuen Block dazugelesen weshalb
             * das RAF auch auch blockCounter * 65536 - 3 * blockCounter gesetzt 
             * wird. 
             */
    
            while (!headerFound) {
    
    
                for (int i = 0; i < byteBlock.length - 3; i++) {
    
    
                    if (byteBlock[i] == (byte) 0xff) {
    
    
                        if (isHeader(byteBlock[i + 1], byteBlock[i + 2],
                                byteBlock[i + 3])) {
                            firstFrameHeader = "11111111"
                                    + JTaggerUtils.intArrayToString(JTaggerUtils
                                            .getBits(byteBlock[i + 1]))
                                    + JTaggerUtils.intArrayToString(JTaggerUtils
                                            .getBits(byteBlock[i + 2]))
                                    + JTaggerUtils.intArrayToString(JTaggerUtils
                                            .getBits(byteBlock[i + 3]));
                            headerFound = true;
                            System.out.println(blockCounter * 65536 - 3 * blockCounter + i);
                            break;
    
    
    
                        }
    
    
                    }
    
    
                }
    
                blockCounter++;
    
                try {
                    raf.seek(blockCounter * 65536 - 3 * blockCounter);
                    raf.read(byteBlock);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
    
                if((blockCounter * 65536 - 3 * blockCounter) > this.length()) {
                    try {
                        raf.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    throw new NoFrameHeaderFoundException("No frameHeaderFound");
    
                }
    
    
    
            }
    
            try {
                raf.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
    
    
    
    
    
        }
    Alles anzeigen

    Visit: http://itunes.apple.com/de/artist/cbh-mobile/id338117761

  • concealer
    7
    concealer
    Mitglied
    Reaktionen
    1
    Punkte
    471
    Beiträge
    92
    • 24. August 2007 um 17:56
    • #6

    hmm was genau suchst du da im mp3 wenn man fragen darf? :)

    Es genügt nicht, keine Meinung zu haben. Man muss auch unfähig sein, sie auszudrücken. Karl Kraus

  • beat
    14
    beat
    Mitglied
    Reaktionen
    2
    Punkte
    2.007
    Beiträge
    338
    • 24. August 2007 um 18:12
    • #7

    den frameHeader. dem interessierten leser empfehle ich: http://www.mp3-tech.org/programmer/frame_header.html

    Visit: http://itunes.apple.com/de/artist/cbh-mobile/id338117761

  • a9bejo
    21
    a9bejo
    Mitglied
    Reaktionen
    42
    Punkte
    4.697
    Beiträge
    913
    • 24. August 2007 um 21:10
    • #8

    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.

    lg, Benjamin Ferrari, bookworm.at

  • beat
    14
    beat
    Mitglied
    Reaktionen
    2
    Punkte
    2.007
    Beiträge
    338
    • 24. August 2007 um 21:14
    • #9

    was du aber nicht machst ist ihn auf korrektheit überprüfen. Das heisst du sucht einfach 0xff und schnappst dir dann 4bytes inkl. raus.

    Aber anscheinend ist man mit ruby da recht schnell.

    Visit: http://itunes.apple.com/de/artist/cbh-mobile/id338117761

  • Maximilian Rupp 27. Dezember 2024 um 12:05

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung