Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android:将一个文件复制到另一个文件的更快解决方案_Java_Android_Filechannel - Fatal编程技术网

Java android:将一个文件复制到另一个文件的更快解决方案

Java android:将一个文件复制到另一个文件的更快解决方案,java,android,filechannel,Java,Android,Filechannel,我正在使用BufferedInputStream复制文件。 我在循环中复制字节[]。 这对于大文件来说相当慢 我看到了FileChannel结构。我也试过用这个。我想知道FileChannel是否比使用IOSTreams更好。在我的测试中,我看不到有重大的性能改进 还是有其他更好的解决方案 我的要求是修改src文件的前1000个字节并复制到目标,将src文件的其余字节复制到目标文件 使用文件通道 private void copyFile(File sourceFile, File destF

我正在使用BufferedInputStream复制文件。 我在循环中复制字节[]。 这对于大文件来说相当慢

我看到了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);
        }

我认为性能无法显著提高,因为硬盘/sd卡速度可能是瓶颈

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

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

此解决方案仅在应用程序启动后不需要立即显示结果的情况下有效


有关详细信息,请参见

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

我终于用覆盖和重命名完成了。使用随机文件覆盖第一个x字节。然后重命名该文件。现在,无论文件大小如何,它的速度都要快得多,并且需要相同的时间


谢谢。

如果看不到您的代码,就不可能回答这个问题。您说您正在使用缓冲输入流进行读取,但您是否也在使用缓冲输出流进行写入?写是一个比读要昂贵得多的操作,对于大文件,你可能无法像k3b所说的那样做太多