Java 在android中,将数据从一个文件复制到另一个文件的速度非常慢?

Java 在android中,将数据从一个文件复制到另一个文件的速度非常慢?,java,android,Java,Android,我正在将数据从一个文件复制到另一个文件。 这需要更多的时间。原因是什么? 我的代码在这里 public void copyData( InputStream in, OutputStream out ) throws IOException { try { in = new CipherInputStream( in, dcipher ); int numRead = 0; byte[

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

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

我的代码在这里
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 ) { } } public void copyData(InputStream in,OutputStream out)引发IOException { 尝试 { in=新的CipherInputStream(in,dcipher); int numRead=0; 字节[]buf=新字节[512]; 而((numRead=in.read(buf))>=0) { out.write(buf,0,numRead); } out.close(); in.close(); } 捕获(java.io.ioe异常) { } }

2个原因

  • 缓冲区太小,设置为4kb或8kb,继续增加直到手机崩溃,然后后退一步
  • 读和写需要在两个不同的线程上。当读取完成时,将其放在q上,当写入完成时,从q中读取它。别忘了同步q对象
  • 在编写这样的代码时,您需要最大限度地使用CPU和内存。在线程和一个while循环上是如此学院化……)

    2个原因

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

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

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

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

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

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

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

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

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

    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 )
        {
        }
    }
    
    我正在将数据从一个文件复制到另一个文件

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

    这需要更多的时间

    时间比什么多

    原因是什么

    基本上你的缓冲区很小。将其至少提高到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字节的缓冲区

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

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

    这需要更多的时间

    时间比什么多

    原因是什么

    基本上你的缓冲区很小。将其至少提高到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字节的缓冲区。

    试试这个
    byte[]buf=new byte[1024]你说的更多时间是什么意思?相比之下,它需要更多的时间。您要复制多少数据?您的新文件和旧文件位于哪里?另外,缓冲区大小是512字节,有这样做的原因吗?我的文件大小是11.8(MB)。我的新文件和旧文件存储在SD卡中。缓冲区太小,增加到4kb或8kb512字节缓冲区太小。试试这个
    byte[]buf=new byte[1024]你说的更多时间是什么意思?相比之下,它需要更多的时间。您要复制多少数据?您的新文件和旧文件位于哪里?另外,缓冲区大小是512字节,有这样做的原因吗?我的文件大小是11.8(MB)。我的新文件和旧文件存储在SD卡中。缓冲区太小,增加到4kb或8kb512字节缓冲区太小。很抱歉打扰您。你能给我任何代码的示例部分吗。谢谢。阅读和写作不需要在不同的线程上。很抱歉打扰您。你能给我任何代码的示例部分吗。谢谢。阅读和写作不需要在不同的线程上。你不需要所有这些。冲洗并不能使它更快:如果有什么不同的话,那就是更慢。此代码不存在
    OutOfMemoryException
    的风险,除非它正在通过TearrayOutStream写入
    ,这将是愚蠢的,并且与问题的条款相反。您不需要所有这些。冲洗并不能使它更快:如果有什么不同的话,那就是更慢。使用此代码不存在
    OutOfMemoryException
    的风险,除非它是通过tearrayoutPutStream写入
    ,这将是愚蠢的,并且与问题的条款相反。