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

时间:2012-06-26 10:23:53

标签: java android

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

这需要更多时间。是什么原因?

我的代码在这里

    public void copyData( InputStream in, OutputStream out ) throws IOException
    {
        try
        {
            in = new CipherInputStream( in, dcipher );
            int numRead = 0;
            byte[] buf = new byte[512];
            while ( ( numRead = in.read( buf ) ) >= 0 )
            {
                out.write( buf, 0, numRead );
            }
            out.close();
            in.close();
        }
        catch ( java.io.IOException e )
        {
        }
    }

2 个答案:

答案 0 :(得分: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 )
    {
    }
}

答案 1 :(得分:-1)

2个原因

  1. 缓冲区太小,使其成为4kb或8kb,持续增加,直到手机崩溃,然后向前移动一步
  2. 阅读和写作需要在两个不同的线程上。当读取完成时,将其放在q上,并且当写完成时从q读取它。别忘了同步q对象。
  3. 编写此类代码时,需要最大程度地使用CPU和内存。在线程和while循环是如此学院C'ish .. :)