ファイルの最後の100バイトをJava(アンドロイド上)のファイルの先頭に移動する必要があります。いくつかの調査をした後、私は実用的なソリューションを持っていますが、私が扱っている大容量のファイル(最大2GB)では遅すぎます。元々RandomAccessFileオブジェクトのread()メソッドを使用しようとしましたが、速度が遅すぎましたので、もう少し掘り下げた後、BufferedInputStreamを使用する代わりの方法が見つかりましたが、パフォーマンスが向上しないようです。ファイルの終わりからJavaのファイルの先頭に100バイト移動する(RandomAccessFileが遅すぎる)
私は、これを行うためのより簡単で簡単で迅速な方法があると考えています。
File file = new File(Environment.getExternalStorageDirectory()+"/sam.dll");
RandomAccessFile f;
OutputStream f1;
try {
f = new RandomAccessFile(file, "r");
long size = file.length();
f.seek(size - 100);
FileInputStream fis = new FileInputStream(f.getFD());
BufferedInputStream bis = new BufferedInputStream(fis);
try {
f1 = new FileOutputStream(new File((Environment.getExternalStorageDirectory()+"/sam.dl4")));
for(int i = 0; i < 100; i++) {
f1.write(bis.read());
}
f.seek(0);
bis = new BufferedInputStream(fis);
for(int j =0; j < size - 100;j++) {
f1.write(f.read());
}
f.close();
f1.close();
bis.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
Log.e("blah",e.toString());
} catch (IOException e) {
e.printStackTrace();
}
方法についての提案は、私はこれをスピードアップすることができます:ここでは
は、私はそれがあまりにも遅いです持って作業コードのですか?私はこれについて完全に間違った方法をしていますか?私はC#でFileStreamオブジェクトを設定し、バイト数を秒単位(2GBファイルでも)にシフトしますが、上記の方法では文字通り時間がかかります。
TIA
これは意味をなさない。 100ビットは整数のバイト数ではありません。 – chrylis
異なるCPU/IO特性を持つWindowsマシンや、Xamarian/mono経由でAndroid上で比較を実行している場所をC#と比較すると、 –
バイトワイズの読み書きは行わないでください。いくつかのバッファを割り当て、いくつかのKBのチャンクを読み書きします。 – blafasel