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