在android中将数据从一个文件复制到另一个文件非常慢?

Posted

技术标签:

【中文标题】在android中将数据从一个文件复制到另一个文件非常慢?【英文标题】:Copying data from one file to another file very slow in android? 【发布时间】:2012-06-27 15:36:32 【问题描述】:

我正在将数据从一个文件复制到另一个文件。 这需要更多时间。是什么原因? 我的代码在这里

公共无效复制数据(输入流输入,输出流输出)抛出 IOException 尝试 in = new CipherInputStream(in, dcipher); int numRead = 0; 字节[] buf = 新字节[512]; 而 ( ( numRead = in.read( buf ) ) >= 0 ) out.write(buf, 0, numRead); out.close(); 附寄(); 捕获(java.io.IOException e)

【问题讨论】:

试试这个byte[] buf = new byte[1024]; 更多时间是什么意思?相比之下,它需要更多的时间。您要复制多少数据?您的新旧文件在哪里?缓冲区大小也是 512 字节,有理由这样做吗? 我的文件大小为 11.8 (MB)。我的新旧文件都存储在sdcard中。 缓冲区太小,增加到4kb或8kb 512 字节缓冲区WAY太小了。 【参考方案1】:

请检查代码,我所做的是增加缓冲区大小并在数据达到 1 MB 时立即刷新数据,这样您就不会遇到内存不足错误。

原因主要是由于缓冲区大小较小,写入小字节信息需要时间。最好一次放一大块。

您可以根据需要修改这些值。

public void copyData( InputStream in, OutputStream out ) throws IOException

    try
    
        int numRead = 0;
        byte[] buf = new byte[102400];
        long total = 0;
        while ( ( numRead = in.read( buf ) ) >= 0 )
        
            total += numRead;
            out.write( buf, 0, numRead );

            //flush after 1MB, so as heap memory doesn't fall short
            if (total > 1024 * 1024) 
              
                total = 0;
                out.flush();
             
        
        out.close();
        in.close();
    
    catch ( java.io.IOException e )
    
    

【讨论】:

你不需要这一切。冲洗不会让它更快:更慢,如果有的话。使用此代码没有OutOfMemoryException 的风险,除非它正在写入ByteArrayOutputStream,这将是愚蠢的,并且与问题的条款相反。【参考方案2】:

我正在将数据从一个文件复制到另一个文件。

不,你不是。您正在解密输入流并将明文写入输出流。

这需要更多时间。

时间比什么多?

什么原因?

基本上是您的微小缓冲区大小。将其提高到至少 8192 字节:如果继续有好处,可以增加更多。

int numRead = 0;

你不需要初始化这个变量。

byte[] buf = new byte[512];

见上文。至少更改为 8192。

while ( ( numRead = in.read( buf ) ) >= 0 )

read(byte[]) 只能在buf.length 为零的情况下返回零,这是您不想永远循环的编程错误。将条件更改为> 0

    catch ( java.io.IOException e )
    
    

从不忽略异常。

我将操作用作加密/解密文件。这就是我使用缓冲区大小为 512 字节的原因。

不,不是。加密或解密不需要 512 字节的缓冲区。

【讨论】:

【参考方案3】:

2 个原因

    缓冲区太小,设置为 4kb 或 8kb,一直增加直到手机崩溃,然后后退 1 步 读取和写入需要在 2 个不同的线程上。读取完成后,将其放在 q 上,写入完成后从 q 中读取。不要忘记同步 q 对象。

在编写此类代码时,您需要最大限度地使用 CPU 和内存。在线程和while循环上是如此学院C'ish .. :)

【讨论】:

抱歉打扰。你能给我代码的任何示例部分吗?谢谢。 读写不需要需要在不同的线程上。

以上是关于在android中将数据从一个文件复制到另一个文件非常慢?的主要内容,如果未能解决你的问题,请参考以下文章

在后台线程中将核心数据从一个数据库复制到另一个数据库

在 vi 中将内容从一个文件复制并粘贴到另一个文件

在Java中将文件从一个目录复制到另一个目录

在R中将文件夹从一个目录复制到另一个目录

如何使用复制命令在 postgres 中将数据从一个表复制到另一个表

如何在.NET应用程序中将邮件从一个邮箱文件夹复制到另一个邮箱文件夹