0

我正在使用 BufferedInputStream 复制文件。我在循环中复制 byte[]。这对于大文件来说非常慢。

我看到了 FileChannel 结构。我也试过用这个。我想知道 FileChannel 是否比使用 IOSTreams 更好。在我的测试过程中,我看不到性能的重大改进。

或者有没有其他更好的解决方案。

我的要求是修改 src 文件的前 1000 个字节并复制到目标,将 src 文件的其余字节复制到目标文件。

使用文件通道

private  void copyFile(File sourceFile, File destFile,byte[] buffer,int srcOffset, int destOffset) {
    try {
        if (!sourceFile.exists()) {
            return;
        }
        if (!destFile.exists()) {
            destFile.createNewFile();
        }
        FileChannel source = null;
        FileChannel destination = null;
        source = new FileInputStream(sourceFile).getChannel();
        source.position(srcOffset);
        destination = new FileOutputStream(destFile).getChannel();
        destination.write(ByteBuffer.wrap(buffer));
        if (destination != null && source != null) {
            destination.transferFrom(source, destOffset, source.size()-srcOffset);
        }
        if (source != null) {
            source.close();
        }
        if (destination != null) {
            destination.close();
        }

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

使用 I/O 流

while ((count = random.read(bufferData)) != -1) {

            fos.write(bufferData, 0, count);
        }
4

3 回答 3

1

我相信性能不会显着提高,因为硬盘/SD卡的速度可能是瓶颈。

但是,创建一个执行复制的后台任务可能会有所帮助。

这并不是真的更快,但感觉更快,因为您不必等待复制操作完成。

此解决方案仅适用于您的应用在启动后不需要立即获得结果的情况。

有关详细信息,请参阅异步任务

于 2012-05-24T12:51:50.453 回答
0

transferFrom()必须循环调用。不能保证在一次通话中转移全部金额。

于 2012-05-25T02:14:36.420 回答
0

我终于做到了使用覆盖和重命名。使用 Randomfile 覆盖前 x 个字节。然后重命名文件。现在,无论文件大小如何,它都更快,并且所有文件都花费相同的时间。

谢谢。

于 2012-05-27T06:32:00.567 回答