1

ファイルの読み取りに MemoryMapped バッファを使用しています。最初にチャネル サイズを取得し、同じサイズを使用してファイルをメモリにマッピングします。ここでは、ファイルを最初からマッピングするため、初期位置は 0 です。次に、別の 400KB のデータがそのファイルに追加されます。今、私はその 400kb だけをマップしたいのですが、コードに何か問題があり、それを理解できず、これを取得しています

260java.io.IOException: Channel not open for writing - cannot extend file to required size
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:812)
at trailreader.main(trailreader.java:55

だからここに私のコードがあります

    BufferedWriter bw;      

    FileInputStream fileinput = null;

    try {
        fileinput = new FileInputStream("simple.csv");
    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }


    FileChannel channel = fileinput.getChannel();




    MappedByteBuffer ByteBuffer;

    try {
        ByteBuffer = fileinput.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    /*
    * Add some 400 bytes to simple.csv. outside of this program...
    */

                 //following line throw exception.
    try {
        ByteBuffer = fileinput.getChannel().map(FileChannel.MapMode.READ_ONLY, channel.size(), 400);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

したがって、私のコードでは、追加された追加データを再読み込みしようとしていますが、機能していません。prob は channel.size() であることがわかっていますが、修正できません。

4

1 に答える 1

1

channel.size()常に現在のファイルの終わりです。400 バイトを超えてマップしようとしています。そこにはありません。次のようなものが必要です:

ByteBuffer = fileinput.getChannel().map(FileChannel.MapMode.READ_ONLY, channel.size()-400, 400);
于 2012-09-20T09:00:33.163 に答える