【问题标题】:Trouble Using FileInputStream To Copy Large Files使用 FileInputStream 复制大文件时遇到问题
【发布时间】:2014-11-24 00:36:46
【问题描述】:

我正在编写一个程序,它通过网络将文件从一台 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();
    }

【问题讨论】:

  • “撞墙”是什么意思。如果您的意思是进度条停留在 0 一段时间,这是意料之中的,因为在进度变为 1 之前,它需要读取和写入至少 1% 的文件(500 KB)。我会添加跟踪到代码来看看发生了什么。

标签: java file copy fileinputstream fileoutputstream


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 2011-08-23
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多