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个原因
在编写这样的代码时,您需要最大限度地使用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写入,这将是愚蠢的,并且与问题的条款相反。