-1

我需要将文件的最后100个字节移动到Java文件的开头(在android上)。在做了一些研究之后,我有一个工作解决方案,但对于我正在使用的一些较大的文件(高达2GB)来说,速度太慢。我最初尝试在RandomAccessFile对象上使用read()方法,而且速度太慢了,所以在进一步挖掘之后,我发现了另一种使用BufferedInputStream的方法,但它看起来并没有提高性能。将100个字节从文件结尾移动到Java文件的起始位置(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

当与C#比较时,你在哪里运行比较 - 在​​具有不同CPU/IO特征的Windows机器上,或者通过Xamarian/mono进行Android操作? –

+0

不要按字节读写。分配一些缓冲区并读取和写入一些KB的块。 – blafasel

回答

1

如前所述,按字节顺序输入/输出操作的漏极性能。

选择恰当的方法是:

  • 分配适当大小的缓冲区
  • 有你InputStream填写一个或很少的I/O操作
  • 缓冲区操纵缓冲
  • 有您的OutputStream在一个或很少的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); 
相关问题