在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中将数据从一个文件复制到另一个文件非常慢?的主要内容,如果未能解决你的问题,请参考以下文章