ファイルチャネルから別のファイルチャネルにファイルの一部をコピーしようとしています (実際には、新しいファイルを書き込むことは最初のファイルと同じです)。
だから、私は256kbのチャンクを読んでいて、それらを別のチャンネルに戻しています
static void openfile(String str) throws FileNotFoundException, IOException {
int size=262144;
FileInputStream fis = new FileInputStream(str);
FileChannel fc = fis.getChannel();
byte[] barray = new byte[size];
ByteBuffer bb = ByteBuffer.wrap(barray);
FileOutputStream fos = new FileOutputStream(str+"2" /**/);
FileChannel fo = fos.getChannel();
StringBuilder sb;
while (fc.read(bb) != -1) {
fo.write(bb /**/);
bb.clear();
}
}
問題は、(私が思うに) fo.write がチャネルの先頭から再度書き込むため、新しいファイルが最後に読み取られたチャンクのみで作成されることです。
試してみましfo.write (bb, bb.position())
たが、期待どおりに機能しませんでした(ポインターはチャネルの先頭に戻りますか?)そしてFileOutputStream(str+"2", true)
、新しいファイルの最後に追加されると考えていましたが、そうではありませんでした。
私は 256kb のチャンクで作業する必要があるので、プログラムの構造をあまり変更することはできません (何かひどく間違ったことをしていない限り)。
で解決bb.flip();
while (fi.read(bb) != -1) {
bb.flip();
fo.write(bb);
bb.clear();
}