繁体   English   中英

使用 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();
    }

对我可以加快速度的方法有什么建议吗? 我是否完全以错误的方式解决这个问题? 我用带有 FileStream 对象的 C# 设置它,它在几秒钟内移动字节(即使对于 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM