-1

ファイルの最後の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

+0

これは意味をなさない。 100ビットは整数のバイト数ではありません。 – chrylis

+0

異なるCPU/IO特性を持つWindowsマシンや、Xamarian/mono経由でAndroid上で比較を実行している場所をC#と比較すると、 –

+0

バイトワイズの読み書きは行わないでください。いくつかのバッファを割り当て、いくつかのKBのチャンクを読み書きします。 – blafasel

答えて

1

すでに述べたように、I/O操作は排水性能を低下させます。

approriateの方法は、次のようになります。

  • いる
  • があなたのInputStream一つにバッファを満たすしているか、非常に少数のI/O操作
  • はバッファ
  • を操作し、適切なサイズのバッファを割り当てますOutputStream 1回または少数のI/O操作でバッファをディスクにフラッシュします。

Java(既に使用しているクラスのみ使用):

byte[] buf = new byte[4096]; 
// lengthRead is the count of bytes read 
int lengthRead = inputStream.read(buf); 
doBufferMagic(buf, lengthRead); 
outputStream.write(buf, 0, lengthRead); 
関連する問題