使用FileInputStream复制大文件时遇到问题

时间:2014-11-23 15:46:28

标签: java file copy fileinputstream fileoutputstream

我正在编写一个程序,通过网络将文件从一台PC复制到另一台PC。在进行此文件复制时,我向用户显示进度以及动态复制了多少文件(在JSP中完成)。在服务器端我使用Java并且对于大多数文件来说效果很好但是如果我遇到一个50 MB的文件我遇到了一些墙壁而我的程序只是在那里停留了一段时间,它最终开始写入输出虽然流。这是因为只是将文件加载到输入流中吗?我知道文件有点大,所以不确定我能做些什么呢。下面是我用来将文件复制到服务器的代码。任何建议或帮助将不胜感激。完全重新设计这个东西我只是想让你轻松阅读复制过的文件进度。

FileInputStream fin = null;
    FileOutputStream fout = null;
    int length = (int)srcFile.length();

    int counter = 0;

    int r = 0;

    byte[] b = new byte[4096];
    try
    {

        fin = new FileInputStream(srcFile);

        fout = new FileOutputStream(dd);
        int progressVal = 0;
        while((r = fin.read(b)) != - 1)
        {

            counter += r;
            fout.write(b,0,r);
            progressVal = (counter * 100/length);


            if(progressVal > 0)
            {
                //communicate to JSP
                WorkstationController.progressMade = progressVal;

            }

        }


    }
    catch (Exception e)
    {

            e.printStackTrace();

    }
    finally
    {
        fin.close();
        fout.close();
    }

1 个答案:

答案 0 :(得分:0)

可能取决于很多因素。什么版本的java?根据版本,默认堆和permgen大小会有所不同。你可能会达到堆大小限制并导致jvm在垃圾收集中捶打以恢复空间。

您可以做的一件事就是尝试不同的大小来分块数据。另外,尝试包装流BufferedInput / OuputStreams。

相关问题