`

文件下载至内存溢出

    博客分类:
  • java
 
阅读更多

 

同事文章:

部分项目的文件下载处理方式如下:

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
byte[] stb = new byte[bis.available()];
int length = 0;
length = bis.read(stb);
bis.close();
response.setContentLength(length);
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream(), length);
bos.write(stb, 0, length);
bos.close();

这种方式下载几十KB的小文件没有什么大碍,但下载大文件(甚至到几十MB)则存在重大的性能隐患

对于下载大文件的场景,代码标红部分,会创建一个巨大的字节数组,并且将整个文件读入内存中。可想而知,当处于文件下载高峰期,将会对系统运行的稳定性造成严重影响!

解决方法:

FileInputStream is = new FileInputStream(new File(filePath));
response.setContentLength(is.available());
FileCopyUtils.copy(is, response.getOutputStream());

将开篇的整段代码,替换为这三行代码,问题解决。

第二行的作用是为了在下载提示框显示文件大小(如图),不写也可以。

最简化可以只写一句(提示框不显示文件大小):FileCopyUtils.copy(new FileInputStream(new File(filePath)), response.getOutputStream());

FileCopyUtils 全名 org.springframework.util.FileCopyUtils

使用了分块的方式进行流复制,并在完成后关闭流,实现类似我们一般的上传处理。每次复制4k,大概如下实现。

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
int bytesRead;
byte[] buffer = new byte[4096];
while ((bytesRead = bis.read(buffer, 0, 4096)) != -1) {
  bos.write(buffer, 0, bytesRead);
}
bos.close();
bis.close();

分享到:
评论

相关推荐

    内存溢出配置,内存溢出配置

    内存溢出配置是IT行业中,尤其是在Java应用开发与运维领域中的一个重要话题,它涉及到系统资源管理、性能调优以及故障排查等多个方面。标题与描述中重复提到“内存溢出配置”,这表明了对这一主题的关注与重视。接...

    易语言防止文件内存溢出源码

    在编程领域,内存管理是至关重要的,特别是在处理大文件时,如何有效防止内存溢出是开发者需要关注的核心问题。易语言是一种以中文编程为特色的编程环境,它为初学者提供了友好的界面和易于理解的语法。在这个场景下...

    易语言防止文件内存溢出

    在编程领域,内存管理是至关重要的一个环节,尤其是在处理大文件时,防止内存溢出显得尤为重要。易语言作为一款国产的、面向对象的编程语言,虽然语法简洁,但同样需要处理好内存分配与释放的问题。本篇文章将深入...

    内存泄漏与内存溢出

    在软件开发领域,尤其是涉及到数据库应用的场景下,内存泄漏(Memory Leak)和内存溢出(Out of Memory,简称OOM)是两个常见的问题,它们直接影响到程序的性能、稳定性和可扩展性。以下是对这两个概念及其相关知识...

    JAVA内存溢出问题总结

    JAVA内存溢出问题总结 JAVA 内存溢出问题是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用的内存大于虚拟机能提供的最大内存。内存溢出问题可以从容器和程序类两个方面进行排查,容器问题...

    Qt内存溢出检测

    在你的压缩包文件`test_memoryLeak`中,可能包含了一个示例项目,用于演示如何在Qt应用中使用VLD进行内存溢出检测。你可以解压后编译运行,观察VLD如何帮助你定位内存问题。 总结来说,Qt内存溢出检测是保证程序...

    JVM内存溢出问题解析

    JVM 内存溢出问题解析 JVM 内存溢出是指程序运行所需的内存大于虚拟机能提供的最大内存的情况。这种情况可能是由于数据量过大、死循环、静态变量和静态方法过多、递归、无法确定是否被引用的对象等原因引起的。同时...

    poi解决读取excel大文件内存溢出的代码

    本资源是从之前的资源综合整理出来的代码,之前的代码不全,需要下载两次,为了...本资源解决的难题是导入大文件excel的时候,会报内存溢出的错误。 欢迎各位下载,解决用户的难题是我的宗旨,好的话给个评价,谢谢!

    Android 内存溢出问题

    在Android开发中,内存管理是优化应用...总的来说,理解堆和栈的特性,以及如何有效地管理内存,对于防止Android应用出现内存溢出至关重要。开发者应始终关注内存使用,优化资源管理,以确保应用程序的稳定性和性能。

    phpExcel导出大量数据出现内存溢出错误的解决方法

    然而,在这个过程中,开发者经常面临内存溢出错误的问题。这主要是因为phpExcel在内存中保存单元格信息,当数据量大时,内存消耗超过PHP配置的最大值,导致错误。下面将详细探讨如何解决phpExcel导出大量数据时出现...

    myeclipse内存溢出问题解决方案

    内存溢出问题在Java开发中是一个常见的问题,尤其是在使用集成开发环境如MyEclipse时,由于资源消耗较大,可能会频繁出现。本文主要讨论如何解决MyEclipse中的内存溢出问题以及相关的Java内存管理知识点。 首先,...

    maven内存溢出解决放啊

    ### Maven内存溢出解决方案 #### 一、引言 在使用Maven进行项目构建时,尤其是在处理大型项目或执行资源密集型任务(如`mvn site`)时,经常会遇到Java堆空间溢出的问题。这类问题通常是由于Maven运行所需的内存...

    解决jetty8内存溢出版本

    标题中的"解决jetty8内存溢出版本"意味着我们面对的是一个针对Jetty 8的特殊构建或配置,其目标是优化内存使用,防止或减少内存溢出的发生。在32位和64位操作系统上都能安装为服务,这意味着这个版本考虑到了兼容性...

    完美解决java读取excel内存溢出问题.rar

    在Java开发中,处理大型Excel文件时,可能会遇到内存溢出的问题。这通常是由于Java的默认内存设置不足以处理大量数据导致的。本解决方案主要针对使用Apache POI库进行Excel读取时遇到的这类问题。 首先,Apache POI...

    大数据Excel操作不会内存溢出POI

    绝对原创,这是我在项目中解决大数据Excel导入时内存溢出问题而编写的Excel行级解析器。同时支持Excel-2003和Excel-2007,excel-2003解析采用poi的eventusermodel模式实现,2007采用xmlreader实现,经项目验证,...

    idea git提交内存溢出后dump文件

    标题中的“idea git提交内存溢出后dump文件”指的是在使用IntelliJ IDEA(简称IDEA)这款流行的Java集成开发环境进行Git操作时遇到了内存溢出的问题,导致系统生成了一个名为`heapDump.hprof`的堆转储文件。内存溢出...

    java解决大批量数据导出Excel产生内存溢出的方案

    在Java开发中,当面临大批量数据导出到Excel文件时,可能会遇到内存溢出的问题。这是因为Excel文件格式本身的设计,以及Java默认处理大数据的方式,可能导致内存占用过高,尤其是在一次性加载大量数据到内存中进行...

    基于HeapAnalyzer456.jar 分析java内存溢出

    而压缩包中的“内存溢出分析工具”可能包含了其他辅助分析内存问题的资源或文档,如使用教程、示例文件等。 总之,HeapAnalyzer456.jar是Java开发中不可或缺的内存诊断工具,通过它可以深入剖析内存溢出的原因,...

Global site tag (gtag.js) - Google Analytics