2

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

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

我的代码在这里

    公共无效复制数据(输入流输入,输出流输出)抛出 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)
        {
        }
    }

4

3 回答 3

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 )
    {
    }
}
于 2012-06-26T10:37:07.563 回答
0

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

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

这需要更多时间。

时间多于什么?

什么原因?

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

于 2017-11-28T00:43:40.340 回答
-1

2 原因

  1. buffer太小了,4kb或者8kb,一直增加直到手机死机,然后后退1步
  2. 阅读和写作需要在 2 个不同的线程上。读取完成后,将其放在 aq 上,写入完成后从 q 中读取。不要忘记同步 q 对象。

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

于 2012-06-26T10:34:07.423 回答