我正在开发一个webapplication,它读取非常大的文件> 50MB并显示它。 Java Spring后端将使用CXF读取这些文件及其内容。我的问题是,在读取50兆字节的文件后,使用的堆的大小增加了500兆字节。我把这个fils读成一个String,这个String将被发送到前端。有什么想法,技巧如何减少Java堆的使用?我尝试了nio,spring的资源课程,但没有任何帮助。
答案 0 :(得分:4)
执行此操作的一种肮脏方法是让Spring @Controller
方法接受OutputStream
或Writer
参数 - 框架将提供HTTP响应的原始输出流,您可以直接写入其中。这避免了内容类型管理等所有良好的逻辑。
更好的方法是定义一个将从控制器方法返回的自定义类型和一个匹配的HttpMessageConverter
,它将(例如)使用该对象中的信息打开相应的文件并将其内容写入输出流。
在这两种情况下,您都不会将文件读入RAM;您将使用单个固定大小的缓冲区将数据直接从磁盘传输到HTTP响应。