首页 文章

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

提问于
浏览
1

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

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

我的代码在这里

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 )
        {
        }
    }

3 回答

  • 0

    2个理由

    • 缓冲区太小,使其成为4kb或8kb,不断增加,直到手机崩溃,然后向前移动一步

    • 阅读和写作需要在两个不同的线程上 . 当读取完成时,将其放在q上,并且当写完成时从q读取它 . 别忘了同步q对象 .

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

  • 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

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

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

    需要更多时间 .

    比什么时间更多?

    这是什么原因?

    基本上你的微小缓冲区大小 . 将其提升至至少8192字节:如果继续有益,则更多 .

    int numRead = 0;
    

    您不需要初始化此变量 .

    byte[] buf = new byte[512];
    

    往上看 . 改为至少8192 .

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

    如果 buf.length 为零,则 read(byte[]) 只能返回零,这是一个您不想永远循环的编程错误 . 将条件更改为 > 0 .

    catch ( java.io.IOException e )
        {
        }
    

    永远不要忽视异常 .

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

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

相关问题