Hi!
Ich habe ein kleines Programm geschrieben, mit dem ich alle Dateien in einem Ordner nach einem bestimmten Begriff durchsuchen kann. Soweit ich das richtig verstanden habe ist NIO besser und schneller, wenn man eine große Menge Daten verarbeiten muss (die Ordner, bei denen ich es bisher verwende haben meistens mehr als 100 Dateien) - jeden falls habe ich also mein Programm von Standard-IO auf NIO umgestellt.
Jetzt habe ich allerdings folgendes Problem:
Die Funktion processFile(File):int soll eine übergebene Datei nach dem Begriff durchsuchen und die Anzahl der gefundenen Treffer zurückgeben (bzw. mit der Option, dass nur festgestellt werden soll, ob der Begriff wenigstens einmal darin vorkommt springt sie schon beim ersten Treffer raus).
Hier ist der Quellcode:
[highlight=Java]private int processFile(File file) throws IOException {
System.out.println("Processing " + file.getName() + "...");
FileChannel fileChannel = new FileInputStream(file).getChannel();
if (fileChannel.size() > Integer.MAX_VALUE) {
System.out.println("Skipping " + file.getName()
+ ", maximum file size exceeded.");
return -1;
}
ByteBuffer buffer = ByteBuffer.allocate((int) fileChannel.size());
fileChannel.read(buffer);
fileChannel.close();
buffer.rewind();
System.out.println("Dekodieren...");
CharBuffer charBuffer = charset.decode(buffer);
charBuffer.rewind();
int termIndex = 0, numberOfMatches = 0;
boolean foundSomething = false;
char c;
try {
while ((c = charBuffer.get()) != 0) {
if (c == term.charAt(termIndex)) {
if (termIndex == termLength - 1) {
numberOfMatches++;
termIndex = 0;
foundSomething = false;
if (!showNumberOfMatches)
return numberOfMatches;
} else {
termIndex++;
foundSomething = true;
}
} else {
if (foundSomething) {
termIndex = 0;
foundSomething = false;
}
}
}
} catch (BufferUnderflowException e) {
e.printStackTrace();
return -1;
}
return numberOfMatches;
}
[/highlight]
term ist der Suchbegriff, dieser ist als Attribut bereits definiert, genauso wie termLength, dessen Länge. showNumberOfMatches ist ein Attribut, welches angibt, ob die genaue Anzahl von Treffern ausgegeben oder nur festgestellt werden soll, ob ein Begriff mindestens einmal vorhanden ist.
Nun funktioniert dieser Code für die meisten Dateien. Für einige allerdings erhalte ich eine BufferUnderflowException. Ich weiß leider nicht warum??
Danke schon mal!
Ich habe ein kleines Programm geschrieben, mit dem ich alle Dateien in einem Ordner nach einem bestimmten Begriff durchsuchen kann. Soweit ich das richtig verstanden habe ist NIO besser und schneller, wenn man eine große Menge Daten verarbeiten muss (die Ordner, bei denen ich es bisher verwende haben meistens mehr als 100 Dateien) - jeden falls habe ich also mein Programm von Standard-IO auf NIO umgestellt.
Jetzt habe ich allerdings folgendes Problem:
Die Funktion processFile(File):int soll eine übergebene Datei nach dem Begriff durchsuchen und die Anzahl der gefundenen Treffer zurückgeben (bzw. mit der Option, dass nur festgestellt werden soll, ob der Begriff wenigstens einmal darin vorkommt springt sie schon beim ersten Treffer raus).
Hier ist der Quellcode:
[highlight=Java]private int processFile(File file) throws IOException {
System.out.println("Processing " + file.getName() + "...");
FileChannel fileChannel = new FileInputStream(file).getChannel();
if (fileChannel.size() > Integer.MAX_VALUE) {
System.out.println("Skipping " + file.getName()
+ ", maximum file size exceeded.");
return -1;
}
ByteBuffer buffer = ByteBuffer.allocate((int) fileChannel.size());
fileChannel.read(buffer);
fileChannel.close();
buffer.rewind();
System.out.println("Dekodieren...");
CharBuffer charBuffer = charset.decode(buffer);
charBuffer.rewind();
int termIndex = 0, numberOfMatches = 0;
boolean foundSomething = false;
char c;
try {
while ((c = charBuffer.get()) != 0) {
if (c == term.charAt(termIndex)) {
if (termIndex == termLength - 1) {
numberOfMatches++;
termIndex = 0;
foundSomething = false;
if (!showNumberOfMatches)
return numberOfMatches;
} else {
termIndex++;
foundSomething = true;
}
} else {
if (foundSomething) {
termIndex = 0;
foundSomething = false;
}
}
}
} catch (BufferUnderflowException e) {
e.printStackTrace();
return -1;
}
return numberOfMatches;
}
[/highlight]
term ist der Suchbegriff, dieser ist als Attribut bereits definiert, genauso wie termLength, dessen Länge. showNumberOfMatches ist ein Attribut, welches angibt, ob die genaue Anzahl von Treffern ausgegeben oder nur festgestellt werden soll, ob ein Begriff mindestens einmal vorhanden ist.
Nun funktioniert dieser Code für die meisten Dateien. Für einige allerdings erhalte ich eine BufferUnderflowException. Ich weiß leider nicht warum??
Danke schon mal!
Zuletzt bearbeitet: