Java Java NIO: FileChannel read(ByteBuffer[],int,int) -> Algorithmus?

Elcrian

Commander
Registriert
Feb. 2008
Beiträge
2.493
Hallo,
weiß jemand wie man die read()-Methode des FileChannels aus der Java NIO-API mit Offset- und Zielwert korrekt benutzt? Die Methode erwartet ein ByteBuffer-Array, allerdings weiß ich weder wieso (i.e. wie der Algorithmus arbeitet), noch wie konkret das programmatisch umzusetzen ist.

Etwas in der Art:
Code:
ByteBuffer[] bb = new ByteBuffer[(int) fChannel.size()];
bb[0] = ByteBuffer.allocate( fChannel.size()); 
fChannel.read(bb, offsetAdress, endAdress);
Auch mit ByteBuffern denen man die komplette Channel-Größe zugewiesen hat (allocate(fChannel.size());) oder eben tausende ByteBuffer (passend zur filesize, angenommen ein BB speichert nur 8 Byte pro BB-Object) werfen allesamt einen NullPointer bei der read-Methode.

Die Docs helfen mir nicht.
 
Kannst du so benutzen:

Code:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Arrays;

public class FileChannelTest {

    private static final int CAPACITY = 16;

    public static void main(String[] args) throws IOException {

        File file = new File("c:/temp/2012-03-13-133140.log");
        final FileChannel fileChannel = new FileInputStream(file).getChannel();
        ByteBuffer buffer = ByteBuffer.allocate(CAPACITY);
        long position = 0;
        int length;
        while ((length = fileChannel.read(buffer, position)) > 0) {
            System.out.printf("Read %d bytes%n", length);
            System.out.println(Arrays.toString(buffer.array()));

            position += CAPACITY;
            buffer.rewind();
        }
    }
}

Wichtig ist der Aufruf von ByteBuffer#rewind() in jedem Schleifendurchlauf.
 
Steht doch in der Doku, wie man die Methoden benutzt? Was verstehst Du daran nicht?

Du verwendest vermutlich einfach die falsche Methode!?

read(ByteBuffer dst)

vs.

read(ByteBuffer[] dsts, int offset, int length)



Poste ein ausführbares Programm, dann kann man sehen, was Du wie machen möchtest.
 
@soares: Ich habe kein "ausführbares Programm" das ich zeigen kann, die Methode ist Teil einer Library für meine Android-App. Ich möchte einen Suchalgorithmus für das File implementieren der möglichst performant via Multithreading läuft; daher brauche ich die offset-Werte (und nicht die normale read(bb)-Methode!) um nur gewisse Chunks zu scannen und dem User während der Suche Rückmeldung zu geben.

@rille: Danke, so kann man das wohl auch umsetzen.
 
Zurück
Oben