使用 Java 从文件末尾移动 100 个字节到文件开头(RandomAccessFile 太慢)

Move 100 bytes from end of file to beginning of file with Java (RandomAccessFile is too slow)

我需要使用 Java(在 android 上)将文件的最后 100 个字节移动到文件的开头。在做了一些研究之后,我有了一个可行的解决方案,但是对于我正在处理的一些较大的文件(最多 2GB)来说它太慢了。我最初尝试在 RandomAccessFile 对象上使用 read() 方法,但它太慢了,所以在进一步挖掘之后,我找到了一种使用 BufferedInputStream 的替代方法,但它似乎根本没有提高性能。

我认为必须有一种更简单、更容易、更快的方法来做到这一点。

这是我的工作代码,它太慢了:

        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

如前所述,按字节 I/O 操作会耗尽性能。

合适的方式是:

  • 分配适当大小的缓冲区
  • 让您的 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);